Paso 6 (3)- Trayectorias de hospitalización y mortalidad con foco en condiciones vinculadas a trastornos de salud mental y consumo de sustancias posterior a un primer ingreso por alguno de estos trastornos, en usuarios/as jóvenes y adultos emergentes de población general y pertenecientes a pueblos originarios, 2018-2021, Chile

Análisis de sensibilidad para resolución mensual, utilizando aquella solución que obtuvo índices de calidad aceptables.

Autor/a

Andrés González Santa Cruz

Fecha de publicación

22 de ene, 2025

Configurar

Código
# remover objetos y memoria utilizada
rm(list=ls());gc()
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  598486 32.0    1366737   73   686445 36.7
Vcells 1125596  8.6    8388608   64  1876466 14.4
Código
#remover imágenes
while(!dev.cur())dev.off()
cat("\014")
Código
if(Sys.info()["sysname"]=="Windows"){
 folder_path <- ifelse(dir.exists("H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/"),
                       "H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/",
                       "C:/Users/CISS Fondecyt/Mi unidad/Alvacast/SISTRAT 2022 (github)/_proposal_grant/2023/")
} else {folder_path <- ""}
load(paste0(folder_path,"avance250117_2.RData"), verbose = TRUE)
Loading objects:
  pam_lcs_quarter_null_comb2_plot_dens_hg
  pam_om_month_null_seq2_plot_hc
  hac_lcs_quarter_null_seq_plot_dens_hg
  best_subset_multinom
  pam_om_month_null_seq2_plot_hg
  asw_grob
  sil_pam_om_clus4_q
  expand_df_month_run
  hac_om_quarter_null_seq_print
  smd_bin
  pam_lcs_quarter_null_comb_stats
  pam_om_quarter_null_comb2_print
  hac_lcs_quarter_null_seq_plot_asw
  confcqi2
  pam_lcs_quarter_null_seq_plot_dens_hc
  num_cores
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide3
  trim_tasa_ppoo_rate_rm
  to
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide4
  pam_om_month_null_seq_plot_dens_pbc
  pam_lcs_quarter_null_seq_plot_dens_hg
  seq_mean_t_dos_grupos
  trim_tasa_ppoo_rate_cens
  lcs_dist_quarter_cens_c
  df_group_yearmonth
  all_quarters
  anova_clus_pam_om7_q
  hac_lcs_month_null_comb_plot_asw
  pam_om_month_null_seq_plot_dens_hc
  frobenius_norm
  expand_df_quarter_run_t_desde_primera_adm
  pam_lcs_quarter_null_comb_print
  pam_om_month_null_seq_plot_dens_hg
  dist_quarter_lcs
  sil_pam_om_clus4_q_nostd
  multinom_pivot_wider
  data_long_est_24_std_imp_rec_imp_areaf_rec
  hg_grob
  trim_tasa_sexo_cnt_rm
  tab_clus_compl_pam_om4_q
  plot_timeseries
  pam_lcs_quarter_null_comb2_plot_asw
  dist_quarter_lcs_cens
  from2
  vector_duplicates
  pam_lcs_month_null_comb2_plot_dens_pbc
  niv_cuidado
  mes_tasa_sexo_rate_cens
  pamRange_month_om_cens
  cqi_month
  distances2
  ing_calendar_month_t_desde_primera_adm
  pam_om_quarter_null_comb2_plot_asw
  asw_grob_m
  pam_om_quarter_null_comb_plot_dens_asw
  pam_lcs_month_null_seq2_plot_hc
  pam_lcs_quarter_null_seq2_stats
  pam_lcs_month_null_seq2_plot_hg
  pamRange_month_om
  data_melt_pam_om4_q
  hac_lcs_month_null_seq_plot_dens_hc
  pam_lcs_quarter_null_seq_plot_hc
  hac_om_month_null_comb_plot_dens_asw
  dt_df_filled_quarter_t_desde_primera_adm
  om_dist_quarter_rm
  num_aristas2
  cluster_result
  hac_lcs_month_null_seq_plot_dens_hg
  dt_df_filled_quarter_t_desde_primera_adm_expand
  pam_lcs_quarter_null_seq_plot_hg
  pam_om_quarter_null_seq2_plot_asw
  sil_neg_pam_om_clus7_q
  hac_om_quarter_null_comb_plot_dens_asw
  hac_om_month_null_seq_plot_dens_asw
  hg_grob_seq_m
  pam_om_quarter_null_seq2_stats
  metodo_result
  all_months
  hac_lcs_quarter_null_comb_plot_hc
  tab_clus_macrozona_pam_om7_q
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens
  pam_om_quarter_null_comb2_plot_dens_pbc
  df_group_trimester
  hac_lcs_quarter_null_comb_plot_hg
  pamRange_month_lcs_rm
  pam_om_quarter_null_seq_print
  expand_df_month_run_t_desde_primera_adm
  pam_lcs_month_null_seq2_stats
  codigos_z_filt
  pam_lcs_month_null_seq2_plot_asw
  dist_month_lcs
  hac_om_month_null_seq_stats
  metodos
  max_clusters
  best_subset_multinom_interactions_parallel
  pam_om_month_null_comb_plot_asw
  cluster_name
  log_distances2
  pam_lcs_quarter_null_seq_plot_dens_asw
  mes_tasa_sexo_cnt_cens
  data_long_est_24_std_imp_rec_imp_areaf_rec_filt2
  pam_om_quarter_null_comb2_plot_pbc
  hac_om_quarter_null_comb_stats
  data_long_est_24_std_imp_rec_imp_areaf_rec_filt3
  resultados_list
  hac_om_quarter_null_seq_plot_asw
  seqcompare_ppoo_quarter_om
  pam_lcs_month_null_comb_stats
  hac_lcs_quarter_null_seq_plot_pbc
  pam_om_month_null_comb2_plot_dens_pbc
  final_plot_seq
  pam_lcs_month_null_comb_plot_dens_hc
  hac_lcs_quarter_null_comb_plot_dens_asw
  trim_tasa_sexo_rate_cens
  om_dist_month_cens_c
  cluster_range
  pam_om_month_null_seq2_stats
  lcs_dist_quarter
  pam_lcs_month_null_comb_plot_dens_hg
  costmatrix_month
  pam_om_quarter_null_seq_plot_pbc
  hac_om_month_null_seq_plot_dens_hc
  hac_om_quarter_null_seq_plot_dens_asw
  ing_calendar_quarter_t_desde_primera_adm_dup
  trim_tasa_ppoo_cnt
  pam_om_month_null_comb2_stats
  g
  dist_month_om
  hac_om_month_null_seq_plot_dens_hg
  state_labels
  dist_quarter_om_rm
  i
  avs_por_cluster_quarter
  pam_om_quarter_null_comb_stats
  freqtab_trim_cens
  j
  hac_om_month_null_comb_plot_asw
  categories_pam_om4_q
  recorded_plot
  pam_om_month_null_comb_plot_pbc
  l
  m
  g_aggr2
  n
  EH_2010_2022_Pasantes_v2_encrip
  sens_min_anios_clus_pam_om4_q
  pam_om_month_null_seq2_plot_dens_hc
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide
  tab_clus_prev_pam_om7_q
  pam_om_quarter_null_seq_plot_dens_hc
  func_tab_range_clus
  pam_lcs_quarter_null_seq_stats
  pam_om_month_null_seq2_plot_dens_hg
  pam_lcs_quarter_null_seq2_plot_hc
  freqtab_mes_cens_reg
  hac_lcs_month_null_seq_plot_asw
  tab_clus_sexo_pam_om7_q
  hac_lcs_quarter_null_comb_plot_pbc
  pam_om_quarter_null_seq_plot_dens_hg
  seq_plot2_pam_om7_q
  pam_om_month_null_seq_plot_hc
  format_cells
  pam_lcs_quarter_null_seq2_plot_hg
  dist_month_om_cens
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2
  pam_lcs_month_null_seq2_plot_dens_pbc
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide3
  pam_om_month_null_seq_plot_hg
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide4
  mes_tasa_ppoo_cnt_rm
  dist_month_lcs_cens
  pam_om_quarter_null_comb_plot_dens_hc
  pam_om_quarter_null_seq2_plot_dens_pbc
  oneway_anova_effect_size
  pamRange_month_om_rm
  pam_om_quarter_null_comb_plot_dens_hg
  .Random.seed
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide_cens
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide
  dist_matrix2
  pam_om_month_null_comb2_plot_hc
  costmatrix_month_rm
  db_centrality_distances2
  hac_lcs_quarter_null_seq_stats
  hac_om_month_null_seq_plot_asw
  om_dist_quarter_cens
  pam_om_month_null_comb2_plot_hg
  bpmn_fig
  trim_tasa_sexo_cnt_cens
  trim_tasa_pam_om4_q_cens_rate
  hac_lcs_quarter_null_seq_print
  cluster
  pam_lcs_month_null_comb_plot_dens_asw
  best_subset_multinom_interactions
  data_long_est_24_std_imp_rec_imp_areaf_rec_cod
  pam_om_month_null_comb2_plot_dens_hc
  om_dist_month_c_rm
  all_years
  print.seqnullcqi.powder
  pam_om_quarter_null_comb_plot_hc
  pam_om_month_null_comb2_plot_dens_hg
  X717508813_Establecimientos_ChileDEIS_MINSAL_29_04_2022
  pam_lcs_quarter_null_comb2_stats
  States_Wide.seq_quarter_t_prim_adm
  LCS
  hac_lcs_month_null_comb_stats
  pam_om_quarter_null_comb_plot_hg
  data_pam_om4_q
  tab_cluster_region_pam_om7_q
  seq_plot_pam_om4_q
  log_distances
  pam_om_quarter_null_seq_plot_dens_asw
  to_vec2
  States_Wide.seq_month_t_prim_adm_RM
  silhouette_values
  tab_clus_reg_pam_om4_q
  trim_tasa_pam_om7_q_cens_rate
  lcs_dist_quarter_cens
  lcs_dist_quarter_c
  pam_om_quarter_null_comb2_plot_dens_hc
  hac_om_quarter_null_seq_plot_dens_hc
  hac_lcs_month_null_comb_plot_dens_hc
  mes_tasa_sexo_rate_rm
  data_long_est_24_std_imp_rec_prev
  pam_om_quarter_null_comb2_plot_dens_hg
  hac_om_quarter_null_seq_plot_dens_hg
  asw_month_qci
  hac_lcs_month_null_comb_plot_dens_hg
  normstatcqi2
  pam_lcs_month_null_seq_plot_asw
  dt_df_filled_month_t_desde_primera_adm
  mes_tasa_ppoo_cnt
  data_long_est_24_std_imp_prev
  hac_om_quarter_null_comb_print
  om_dist_quarter_c
  freqtab_trim_cens_reg
  pam_om_month_null_comb_plot_hc
  dist_quarter_lcs_rm
  svg_code
  sil_pam_om_clus7_q_nostd
  hac_om_month_null_comb_print
  pam_om_month_null_comb_plot_hg
  hac_lcs_month_null_seq_stats
  pam_om_month_null_seq_plot_dens_asw
  seqcompare_sex_quarter_lcs
  unido_std_2024_2_naomit
  final_plot_comb_m
  pbc_grob
  hac_om_month_null_comb_plot_pbc
  end_date
  cod_reg_homo_pam_om4_q
  dist_quarter_om_cens
  ppoo_clus_pre_pam_om7_q
  mes_tasa_sexo_cnt
  hac_lcs_month_null_comb_plot_dens_asw
  to_vec
  hac_lcs_month_null_seq_plot_dens_pbc
  pam_lcs_quarter_null_comb2_plot_dens_asw
  pam_lcs_month_null_seq2_plot_dens_hc
  pamRange_quarter_lcs_cens
  pam_om_quarter_null_comb2_stats
  hac_om_month_null_seq_plot_hc
  edges
  as
  pam_lcs_month_null_seq2_plot_dens_hg
  pam_om_month_null_comb2_plot_pbc
  hac_om_month_null_seq_plot_hg
  pam_lcs_quarter_null_comb_plot_asw
  pam_lcs_quarter_null_seq_plot_pbc
  sil_pam_om_clus7_q
  weighted_edges2
  pam_lcs_month_null_seq_stats
  lcs_dist_month_c
  hac_lcs_quarter_null_comb_plot_dens_hc
  pam_lcs_month_null_comb2_print
  folder_path
  theme_custom_sjplot2
  pam_om_quarter_null_seq_plot_hc
  hac_lcs_quarter_null_comb_plot_dens_hg
  hac_lcs_quarter_null_seq_plot_dens_pbc
  labels_pam_om7_q
  pam_om_quarter_null_seq2_print
  pam_om_quarter_null_seq_plot_hg
  hac_om_month_null_comb_plot_dens_hc
  state_labelsRM
  tab_cl_mortalidad_pam_om4_q
  hg_grob_m
  pam_om_month_null_comb_print
  trim_tasa_ppoo_rate
  hac_om_month_null_comb_plot_dens_hg
  degree_centrality2
  mes_tasa_sexo_cnt_rm
  States_Wide.seq_quarter_t_prim_adm_cens
  pam_lcs_month_null_seq_print
  cl
  cluster_labels7
  States_Wide.seq_quarter_t_prim_adm_RM_cens
  dt_ing_calendar_quarter_t_desde_primera_adm
  pam_om_quarter_null_comb_plot_pbc
  pam_lcs_quarter_null_seq2_plot_asw
  data_long_establecimiento_2024_std
  pam_om_month_null_seq_stats
  g2
  color_palette
  States_Wide.seq_month_t_prim_adm_cens
  pamRange_quarter_om
  pam_om_month_null_seq_plot_asw
  pam_lcs_month_null_comb_plot_hc
  dt_df_filled
  df
  hac_lcs_quarter_null_comb_stats
  as.data.frame.TableOne
  graph
  seqtrate_t
  pam_lcs_month_null_comb_plot_hg
  pam_om_month_null_seq2_plot_dens_asw
  tab_clus_macrozona_pam_om4_q
  pam_om_quarter_null_seq_plot_asw
  costmatrix_quarter
  seqcompare_sex_quarter_om
  pam_lcs_quarter_null_comb2_plot_hc
  pam_lcs_quarter_null_comb_plot_dens_asw
  pam_lcs_month_null_comb_plot_pbc
  dist_month_om_rm
  pam_lcs_quarter_null_comb2_plot_hg
  pam_lcs_quarter_null_comb2_plot_dens_pbc
  ing_calendar_quarter_t_desde_primera_adm
  trim_tasa_sexo_rate
  dt_ing_calendar_quarter_t_desde_primera_adm_dedup
  distances
  freqtab_mes_cens
  hc_grob
  dt_df_filled_month_t_desde_primera_adm_expand
  freqtab_mes
  arearef_dummy
  all_months_df
  pam_lcs_month_null_seq_plot_dens_hc
  labels_A
  cluster_labels
  pamRange_quarter_lcs2
  labels_B
  pam_lcs_month_null_seq_plot_dens_hg
  pam_lcs_month_null_comb2_stats
  weighted_edges
  dt_ing_calendar_month_t_desde_primera_adm_dedup
  .__jobsettings__
  pam_lcs_quarter_null_seq2_plot_dens_pbc
  table_data_pam_om4_q
  hac_lcs_month_null_comb_plot_dens_pbc
  lcs_dist_month
  om_dist_quarter_c_rm
  pam_om_month_null_seq_plot_pbc
  g_aggr
  asw_grob_seq_m
  degree_centrality
  data_long
  categories_pam_om7_q
  pam_lcs_month_null_comb_plot_dens_pbc
  hc_grob_m
  pam_lcs_quarter_null_comb2_plot_pbc
  hac_om_month_null_seq_plot_dens_pbc
  pam_om_quarter_null_comb2_plot_hc
  pamRange_quarter_om_cens
  pam_lcs_month_null_seq2_print
  pam_om_quarter_null_comb2_plot_hg
  pam_lcs_month_null_comb2_plot_hc
  check_full_trimestre
  ratio_plot
  pam_om_month_null_comb2_plot_dens_asw
  pam_lcs_month_null_comb2_plot_hg
  seq_plot2_pam_om4_q
  quarters
  pam_om_month_null_comb_plot_dens_hc
  pam_om_quarter_null_comb_print
  anova_clus_pam_om4_q
  ing_calendar_month_t_desde_primera_adm_dup
  state_alphabet
  dist_matrix
  cadena_A
  pam_om_month_null_comb_plot_dens_hg
  hac_lcs_month_null_seq_plot_hc
  cadena_B
  pam_om_month_null_seq2_plot_dens_pbc
  hac_lcs_month_null_seq_plot_hg
  pam_om_quarter_null_seq2_plot_pbc
  degree_centrality2_filt
  lcs_dist_quarter_rm
  hac_om_quarter_null_seq_stats
  tab_clus_compl_pam_om7_q
  hac_om_quarter_null_comb_plot_dens_pbc
  hac_lcs_quarter_null_comb_plot_asw
  l2
  mes_tasa_sexo_rate
  hac_om_quarter_null_comb_plot_pbc
  tab_clus_prev_pam_om4_q
  pam_lcs_quarter_null_seq2_plot_dens_asw
  freqtab_trim
  hc_grob_seq_m
  na_count
  check_full_meses
  tab_clus_sexo_pam_om4_q
  cqi_quarter
  hac_om_quarter_null_comb_plot_dens_hc
  save_base_plot_as_grob
  pam_om_month_null_comb_plot_dens_asw
  seq_mean_t
  new_labels
  hac_om_quarter_null_comb_plot_dens_hg
  pam_om_month_null_comb2_plot_asw
  hac_om_quarter_null_comb_plot_hc
  pamRange_quarter_om2
  pam_lcs_quarter_null_seq2_plot_dens_hc
  from
  .main
  pam_lcs_month_null_comb2_plot_dens_asw
  silhouette_full
  data_melt_pam_om7_q
  hac_om_quarter_null_comb_plot_hg
  pam_lcs_quarter_null_seq2_plot_dens_hg
  seqcount_t
  num_aristas
  sil_neg_pam_om_clus4_q
  metodo
  hac_lcs_month_null_seq_plot_pbc
  copiar_nombres2
  tab_clus_reg_pam_om7_q
  hac_lcs_month_null_comb_plot_hc
  pam_lcs_month_null_comb2_plot_asw
  edge_colors2
  pam_lcs_quarter_null_seq_plot_dens_pbc
  pam_om_month_null_seq2_print
  pam_om_quarter_null_comb_plot_dens_pbc
  hac_lcs_month_null_comb_plot_hg
  hac_om_month_null_seq_plot_pbc
  to2
  chisq_cramerv
  pamRange_quarter_lcs
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens_d
  trim_tasa2_pam_om7_q_cens_rate
  tabs_quarter_clus_sol
  pam_lcs_quarter_null_seq_plot_asw
  trim_tasa_ppoo_cnt_rm
  data_long_est_24_std_imp_rec_imp
  color_palette2
  pam_lcs_quarter_null_comb_plot_dens_hc
  avs_por_cluster_month
  trim_tasa_pam_om4_q_cens_cnt
  pam_lcs_quarter_null_comb_plot_pbc
  pbc_grob_m
  pam_lcs_quarter_null_seq2_print
  pam_lcs_quarter_null_comb_plot_hc
  pam_lcs_quarter_null_comb_plot_dens_hg
  pam_om_quarter_null_comb2_plot_dens_asw
  tab_cluster_region_pam_om4_q
  pam_lcs_quarter_null_comb_plot_hg
  pam_om_month_null_seq_print
  pamRange_month_lcs
  sesion_info
  om_dist_quarter
  mes_tasa_ppoo_rate
  trim_tasa2_pam_om7_q_cens_cnt
  tabla_proporciones
  States_Wide.seq_month_t_prim_adm_RM_cens
  db_centrality_distances
  cod_reg_homo_pam_om7_q
  threshold
  om_dist_month_rm
  X717508813_Establecimientos_ChileDEIS_MINSAL_cerrado_29_04_2022
  data_long_est_24_std_imp_rec_imp_areaf
  ppoo_clus_pre_pam_om4_q
  trim_tasa2_pam_om4_q_cens_rate
  casos_prob
  lcs_dist_month_cens
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide4_cens
  g2_filt
  hac_om_month_null_comb_plot_dens_pbc
  hac_lcs_quarter_null_comb_print
  nivel_atencion_no_aplica
  pam_lcs_quarter_null_seq2_plot_pbc
  hac_lcs_month_null_comb_plot_pbc
  hac_lcs_quarter_null_seq_plot_hc
  pam_om_quarter_null_seq2_plot_hc
  costmatrix_quarter_cens
  pam_lcs_month_null_seq2_plot_pbc
  mes_tasa_ppoo_rate_cens
  pam_om_month_null_seq2_plot_asw
  hac_om_quarter_null_seq_plot_dens_pbc
  hac_lcs_quarter_null_seq_plot_hg
  pam_om_quarter_null_seq2_plot_hg
  trim_tasa_pam_om7_q_cens_cnt
  States_Wide.seq_month_t_prim_adm
  pamRange_month_lcs_cens
  pam_lcs_month_null_comb_print
  pam_om_month_null_comb2_print
  pam_lcs_month_null_comb2_plot_pbc
  hac_lcs_month_null_seq_print
  pbc_grob_seq_m
  start_date
  def_enc17_21
  pam_om_quarter_null_seq2_plot_dens_asw
  lcs_dist_month_c_rm
  dist_quarter_om
  trim_tasa2_pam_om4_q_cens_cnt
  tab_cl_mortalidad_pam_om7_q
  States_Wide.seq_quarter_t_prim_adm_RM
  pam_lcs_month_null_comb2_plot_dens_hc
  edges2
  pam_lcs_month_null_comb2_plot_dens_hg
  result_df_trim
  data_long_est_24_std_imp_rec_imp_areaf_rec_filt
  lcs_dist_month_rm
  trim_tasa_sexo_cnt
  pam_lcs_month_null_seq_plot_dens_asw
  pam_om_month_null_comb_stats
  pam_om_month_null_seq2_plot_pbc
  sens_min_anios_clus_pam_om7_q
  diag_pam_om7_q_6036
  diag_pam_om4_5939
  dist_month_lcs_rm
  hac_lcs_quarter_null_comb_plot_dens_pbc
  om_dist_month
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide4_cens
  costmatrix_month_cens
  diag_pam_om7_q_5710
  pam_om_quarter_null_seq2_plot_dens_hc
  pam_lcs_month_null_comb_plot_asw
  fisher_posthoc_all_cols
  labels_pam_om4_q
  final_plot_m_seq
  hac_om_quarter_null_seq_plot_pbc
  pam_om_quarter_null_seq2_plot_dens_hg
  om_dist_month_c
  opar
  hac_om_quarter_null_comb_plot_asw
  hac_om_quarter_null_seq_plot_hc
  mes_tasa_ppoo_rate_rm
  expand_df_quarter_run
  mes_tasa_ppoo_cnt_cens
  diag_pam_om7_q_5935
  hac_om_quarter_null_seq_plot_hg
  dt_ing_calendar_month_t_desde_primera_adm
  pam_lcs_quarter_null_seq_print
  data_pam_om7_q
  final_plot_comb
  pamRange_quarter_om_rm
  result2
  seq_plot_pam_om7_q
  tabs_month_clus_sol
  df_filled
  freqtab_mes_reg
  om_dist_quarter_cens_c
  LCS_df
  hac_lcs_quarter_null_seq_plot_dens_asw
  hac_om_month_null_comb_stats
  pam_lcs_month_null_seq2_plot_dens_asw
  lcs_dist_quarter_c_rm
  hac_lcs_month_null_seq_plot_dens_asw
  pamRange_quarter_lcs_rm
  pam_om_quarter_null_seq_plot_dens_pbc
  edge_colors
  trim_tasa_sexo_rate_rm
  costmatrix_quarter_rm
  data_long_establecimiento
  table_data_pam_om7_q
  om_dist_month_cens
  trim_tasa_ppoo_cnt_cens
  codigos_z2
  pam_lcs_quarter_null_comb_plot_dens_pbc
  pam_lcs_month_null_seq_plot_pbc
  pam_om_quarter_null_seq_stats
  hac_om_month_null_seq_print
  hac_om_month_null_comb_plot_hc
  unido_std_2024_2_imp
  asw_quarter_qci
  lcs_dist_month_cens_c
  state_alphabetRM
  hac_om_month_null_comb_plot_hg
  pam_om_quarter_null_comb_plot_asw
  dtX2023_12_05_DatosEgresosHosp_encrip_s5_adultl_2
  unido_std_2024_2
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens_d
  dtX2023_12_05_DatosEgresosHosp_encrip_s5_adultl_3
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide_cens
  seqcompare_ppoo_quarter_lcs
  pam_lcs_quarter_null_comb2_print
  pamRange_month_om2
  pam_lcs_month_null_seq_plot_hc
  hac_lcs_month_null_comb_print
  freqtab_trim_reg
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens
  pamRange_month_lcs2
  pam_lcs_month_null_seq_plot_hg
  pam_lcs_month_null_seq_plot_dens_pbc
  pam_om_month_null_comb_plot_dens_pbc
  hac_lcs_quarter_null_seq_plot_dens_hc
  pam_lcs_quarter_null_comb2_plot_dens_hc
  .QuartoInlineRender
  codigos_z_filt2

Paquetes estadísticos

Código
#elegir repositorio
if(Sys.info()["sysname"]=="Windows"){
  options(repos = c(CRAN = "https://cran.dcc.uchile.cl/"))
}
options(install.packages.check.source = "yes") # Chequea la fuente de los paquetes

#borrar caché
#system("fc-cache -f -v")

if(!require(pacman)){install.packages("pacman");require(pacman)}

pacman::p_unlock(lib.loc = .libPaths()) #para no tener problemas reinstalando paquetes

if(Sys.info()["sysname"]=="Windows"){
if (getRversion() != "4.4.0") { stop("Requiere versión de R 4.4.0. Actual: ", getRversion()) }
}

if(!require(job)){install.packages("job");require(job)}
if(!require(kableExtra)){install.packages("kableExtra");require(kableExtra)}
if(!require(tidyverse)){install.packages("tidyverse");require(tidyverse)}
if(!require(cluster)){install.packages("cluster"); require(cluster)}
if(!require(WeightedCluster)){install.packages("WeightedCluster"); require(WeightedCluster)}
if(!require(devtools)){install.packages("devtools"); require(devtools)}
if(!require(TraMineR)){install.packages("TraMineR"); require(TraMineR)}
if(!require(TraMineRextras)){install.packages("TraMineRextras"); require(TraMineRextras)}
if(!require(NbClust)){install.packages("NbClust"); require(NbClust)}
if(!require(haven)){install.packages("haven"); require(haven)}
if(!require(ggseqplot)){install.packages("ggseqplot"); require(ggseqplot)}
if(!require(grid)){install.packages("grid"); require(grid)}
if(!require(gridExtra)){install.packages("gridExtra"); require(gridExtra)}
if(!require(Tmisc)){install.packages("Tmisc"); require(Tmisc)}
if(!require(factoextra)){install.packages("factoextra"); require(factoextra)}
if(!require(stargazer)){install.packages("stargazer"); require(stargazer)}
if(!require(gtsummary)){install.packages("gtsummary"); require(gtsummary)}
if(!require(lmtest)){install.packages("lmtest"); require(lmtest)}
if(!require(emmeans)){install.packages("emmeans"); require(emmeans)}
if(!require(effsize)){install.packages("effsize"); require(effsize)}
if(!require(fpp2)){install.packages("fpp2"); require(fpp2)}
if(!require(purrr)){install.packages("purrr"); require(purrr)}
if(!require(forecast)){install.packages("forecast"); require(forecast)}
if(!require(magrittr)){install.packages("magrittr"); require(magrittr)}
if(!require(foreach)){install.packages("foreach"); require(foreach)}
if(!require(doParallel)){install.packages("doParallel"); require(doParallel)}
if(!require(progressr)){install.packages("progressr"); require(progressr)}
if(!require(chisq.posthoc.test)){devtools::install_github("ebbertd/chisq.posthoc.test")}
if(!require(rstatix)){install.packages("rstatix"); require(rstatix)}
if(!require(rio)){install.packages("rio"); require(rio)}
if(!require(cowplot)){install.packages("cowplot"); require(cowplot)}
if(!require(DiagrammeR)){install.packages("DiagrammeR"); require(DiagrammeR)}
if(!require(DiagrammeRsvg)){install.packages("DiagrammeRsvg"); require(DiagrammeRsvg)}
if(!require(rsvg)){install.packages("rsvg"); require(rsvg)}


seq_mean_t_dos_grupos <- function(bd = NULL, group1, group2) {
  # Agrupar por ambas variables
  resultados <- by(bd, list(group1, group2), seqmeant)
  
  # Obtener todas las combinaciones posibles de los grupos
  combinaciones <- expand.grid(group1 = unique(group1), group2 = unique(group2), stringsAsFactors = FALSE)
  
  # Extraer los resultados y asociarlos con las combinaciones
  resultados_df <- do.call(rbind, lapply(seq_along(resultados), function(i) {
    group_name1 <- attr(resultados, "dimnames")[[1]][i]
    group_name2 <- attr(resultados, "dimnames")[[2]][i]
    
    data.frame(factor_inclusivo_1 = group_name1, 
               factor_inclusivo_2 = group_name2, 
               Mean = resultados[[i]])
  }))
  
  # Unir los resultados con las combinaciones para rellenar los valores faltantes
  final_df <- merge(combinaciones, resultados_df, by.x = c("group1", "group2"), 
                    by.y = c("factor_inclusivo_1", "factor_inclusivo_2"), all.x = TRUE)
  
  return(final_df)
}

multinom_pivot_wider <- function(x) {
  # check inputs match expectatations
  # create tibble of results
  df <- tibble::tibble(outcome_level = unique(x$table_body$groupname_col))
  df$tbl <- 
    purrr::map(
      df$outcome_level,
      function(lvl) {
        gtsummary::modify_table_body(
          x, 
          ~dplyr::filter(.x, .data$groupname_col %in% lvl) %>%
            dplyr::ungroup() %>%
            dplyr::select(-.data$groupname_col)
        )
      }
    )
  
  tbl_merge(df$tbl, tab_spanner = paste0("**", df$outcome_level, "**"))
}

best_subset_multinom <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores
  predictors_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de predictores
  for (i in seq_along(predictors_list)) {
    predictors <- predictors_list[[i]]
    formula <- as.formula(paste(y, "~", paste(predictors, collapse = "+")))
    
    # Ajustar el modelo multinomial
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL
    )
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      # Extraer el AIC del modelo
      aic <- AIC(model)
      
      # Almacenar la información en una lista
      results[[length(results) + 1]] <- list(
        predictors = predictors,
        model = model,
        AIC = aic
      )
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = paste(res$predictors, collapse = "+"),
        AIC = res$AIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por AIC de menor a mayor
  results_df <- results_df %>% arrange(AIC)
  
  return(results_df)
}
best_subset_multinom_interactions <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de efectos principales
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- list()
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Combinar efectos principales e interacciones
    all_terms <- c(main_effects, interaction_terms)
    
    # Generar todas las combinaciones posibles de términos (incluyendo interacciones)
    # Solo se incluyen interacciones si sus efectos principales están presentes
    term_combinations <- list()
    
    # Obtener todos los subconjuntos de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Incluir interacciones solo si todos sus efectos principales están incluidos
      possible_interactions <- interaction_terms[
        sapply(interaction_terms, function(x) {
          vars_in_interaction <- unlist(strsplit(x, ":"))
          all(vars_in_interaction %in% me)
        })
      ]
      
      # Generar todas las combinaciones de interacciones para incluir
      interaction_subsets <- list(NULL)
      if (length(possible_interactions) > 0) {
        interaction_subsets <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
      }
      
      # Para cada combinación de interacciones, crear el conjunto completo de términos
      for (ints in interaction_subsets) {
        if (is.null(ints)) {
          full_terms <- terms
        } else {
          full_terms <- c(terms, ints)
        }
        
        # Añadir a la lista de combinaciones de términos
        term_combinations <- append(term_combinations, list(full_terms))
      }
    }
    
    # Ajustar modelos para cada combinación de términos
    for (terms in term_combinations) {
      formula <- as.formula(paste(y, "~", paste(terms, collapse = "+")))
      
      # Ajustar el modelo multinomial
      model <- tryCatch(
        nnet::multinom(formula, data = data, trace = FALSE),
        error = function(e) NULL,
        warning = function(w) NULL
      )
      
      # Si el modelo se ajustó correctamente, almacenar los resultados
      if (!is.null(model)) {
        # Extraer el BIC del modelo
        bic <- BIC(model)
        
        # Almacenar la información en la lista de resultados
        results[[length(results) + 1]] <- list(
          predictors = paste(terms, collapse = " + "),
          model = model,
          BIC = bic
        )
      }
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = res$predictors,
        BIC = res$BIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por BIC de menor a mayor
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}

best_subset_multinom_interactions_parallel <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias dentro de la función
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  require(foreach)
  require(doParallel)
  require(progressr)
  
  # Iniciar los gestores de progreso
  handlers(global = TRUE)
  handlers("txt")
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar las fórmulas de los modelos
  formulas_list <- list()
  
  # Generar todas las fórmulas posibles con interacciones hasta de 3 variables
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- character(0)  # Aseguramos que es un vector de caracteres
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Generar todas las combinaciones posibles de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Identificar interacciones cuyos efectos principales están en 'me'
      if (length(interaction_terms) > 0) {
        possible_interactions <- interaction_terms[
          vapply(interaction_terms, function(x) {
            vars_in_interaction <- unlist(strsplit(x, ":"))
            all(vars_in_interaction %in% me)
          }, FUN.VALUE = logical(1))
        ]
      } else {
        possible_interactions <- character(0)
      }
      
      # Generar todas las combinaciones posibles de estas interacciones
      interaction_subsets <- list(character(0))  # Incluir el caso sin interacciones
      if (length(possible_interactions) > 0) {
        interaction_combinations <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
        interaction_subsets <- c(interaction_subsets, interaction_combinations)
      }
      
      # Para cada combinación de interacciones
      for (ints in interaction_subsets) {
        full_terms <- c(terms, ints)
        
        # Crear la fórmula del modelo y almacenarla
        formula_str <- paste(y, "~", paste(full_terms, collapse = "+"))
        formulas_list <- append(formulas_list, list(formula_str))
      }
    }
  }
  
  # Eliminar posibles duplicados de fórmulas
  formulas_list <- unique(formulas_list)
  
  # Total de modelos a ajustar
  total_models <- length(formulas_list)
  
  # Iniciar el progreso
  p <- progressor(steps = total_models)
  
  # Ajustar los modelos en paralelo usando foreach
  results_list <- foreach(i = 1:total_models, .packages = c("nnet", "MASS"), .combine = 'rbind') %dopar% {
    formula_str <- formulas_list[[i]]
    formula <- as.formula(formula_str)
    
    # Ajustar el modelo
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL,
      warning = function(w) NULL
    )
    
    # Actualizar el progreso
    p(sprintf("Ajustando modelo %d de %d", i, total_models))
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      bic <- BIC(model)
      data.frame(
        predictors = formula_str,
        BIC = bic,
        stringsAsFactors = FALSE
      )
    } else {
      NULL
    }
  }
  
  # Convertir los resultados a dataframe y ordenar por BIC
  results_df <- as.data.frame(results_list)
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}


num_cores <- parallel::detectCores() - 1
cl <- makeCluster(num_cores)
registerDoParallel(cl)

#pacman job kableExtra tidyverse cluster WeightedCluster devtools TraMineR TraMineRextras NbClust haven ggseqplot gridExtra Tmisc factoextra reticulate withr rmarkdown quarto

options(knitr.kable.NA = '')


#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#

knitr::knit_hooks$set(time_it = local({
  now <- NULL
  function(before, options) {
    if (before) {
      # record the current time before each chunk
      now <<- Sys.time()
    } else {
      # calculate the time difference after a chunk
      res <- ifelse(difftime(Sys.time(), now)>(60^2),difftime(Sys.time(), now)/(60^2),difftime(Sys.time(), now)/(60^1))
      # return a character string to show the time
      x<-ifelse(difftime(Sys.time(), now)>(60^2),paste("Tiempo que demora esta sección:", round(res,1), "horas"),paste("Tiempo que demora esta sección:", round(res,1), "minutos"))
      paste('<div class="message">', gsub('##', '\n', x),'</div>', sep = '\n')
    }
  }
}))
knitr::opts_chunk$set(time_it = TRUE)

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:

format_cells <- function(df, rows ,cols, value = c("italics", "bold", "strikethrough")){
  
  # select the correct markup
  # one * for italics, two ** for bold
  map <- setNames(c("*", "**", "~~"), c("italics", "bold", "strikethrough"))
  markup <- map[value]  
  
  for (r in rows){
    for(c in cols){
      
      # Make sure values are not factors
      df[[c]] <- as.character( df[[c]])
      
      # Update formatting
      df[r, c] <- ifelse(nchar(df[r, c])==0,"",paste0(markup, gsub(" ", "", df[r, c]), markup))
    }
  }
  
  return(df)
}
#To produce line breaks in messages and warnings
knitr::knit_hooks$set(
  error = function(x, options) {
    paste('\n\n<div class="alert alert-danger">',
          gsub('##', '\n', gsub('^##\ Error', '**Error**', x)),
          '</div>', sep = '\n')
  },
  warning = function(x, options) {
    paste('\n\n<div class="alert alert-warning">',
          gsub('##', '\n', gsub('^##\ Warning:', '**Warning**', x)),
          '</div>', sep = '\n')
  },
  message = function(x, options) {
    paste('<div class="message">',
          gsub('##', '\n', x),
          '</div>', sep = '\n')
  }
)

#_#_#_#_#_#_#_#_#_#_#_#_#_
invisible("Function to format CreateTableOne into a database")

as.data.frame.TableOne <- function(x, ...) {capture.output(print(x,showAllLevels = TRUE, varLabels = T,...) -> x)
  y <- as.data.frame(x)
  y$characteristic <- dplyr::na_if(rownames(x), "")
  y <- y %>%
    fill(characteristic, .direction = "down") %>%
    dplyr::select(characteristic, everything())
  rownames(y) <- NULL
  y}
#_#_#_#_#_#_#_#_#_#_#_#_#_
# Austin, P. C. (2009). The Relative Ability of Different Propensity 
# Score Methods to Balance Measured Covariates Between 
# Treated and Untreated Subjects in Observational Studies. Medical 
# Decision Making. https://doi.org/10.1177/0272989X09341755
smd_bin <- function(x,y){
  z <- x*(1-x)
  t <- y*(1-y)
  k <- sum(z,t)
  l <- k/2
  
  return((x-y)/sqrt(l))
  
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:


if(.Platform$OS.type == "windows") withAutoprint({
  memory.size()
  memory.size(TRUE)
  memory.limit()
})
> memory.size()
[1] Inf
> memory.size(TRUE)
[1] Inf
> memory.limit()
[1] Inf
Código
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
func_tab_range_clus<-
function(range_clus){
rbind.data.frame(
  lapply(
    list(
      as.vector(rev(sort(table(range_clus$clustering$cluster2)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster3)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster4)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster5)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster6)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster7)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster8)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster9)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster10)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster11)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster12)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster13)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster14)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster15))))
    ),
    function(x) {
      length_out <- max(sapply(list(
        as.vector(rev(sort(table(range_clus$clustering$cluster2)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster3)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster4)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster5)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster6)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster7)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster8)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster9)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster10)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster11)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster12)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster13)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster14)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster15))))
      ), length))
      c(x, rep(NA, length_out - length(x)))
    }
  )
)%>%
  t() |> 
  data.frame()%>%
  `rownames<-`(NULL)
}


frobenius_norm <- function(matrix1, matrix2) {
    if (!all(dim(matrix1) == dim(matrix2))) {
        stop("Matrices must have the same dimensions")
    }
    
    # Replace NA values with 0 (or any other desired default)
    matrix1[is.na(matrix1)] <- 0
    matrix2[is.na(matrix2)] <- 0
    
    # Calculate the residuals
    residuals <- matrix1 - matrix2
    
    # Frobenius norm
    frobenius <- sqrt(sum(residuals^2))
    return(frobenius)
}



#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
confcqi2 <- function(nullstat, quant, n){
  alpha <- (1-quant)/2
  #calpha <- alpha+(alpha-1)/n
  #print(c(calpha, alpha))
  #minmax <- quantile(nullstat, c(calpha, 1-calpha))
  minmax <- quantile(nullstat, c(alpha, 1-alpha))
  return(minmax)
}

normstatcqi2 <- function(bcq, stat, norm=TRUE){
  origstat <- bcq$clustrange$stats[, stat]
  nullstat <- bcq$stats[[stat]]
  #normstat <- rbind(nullstat, origstat)
  if(norm){
    for(i in seq_along(origstat)){
      mx <- mean(nullstat[, i])
      sdx <- sd(nullstat[, i])
      nullstat[ , i] <- (nullstat[, i]-mx)/sdx
      origstat[i] <- (origstat[i]-mx)/sdx
    }
  }
  alldatamax <- apply(nullstat, 1, max)#as.vector(xx)
  sumcqi <- list(origstat=origstat, nullstat=nullstat, alldatamax=alldatamax)
  return(sumcqi)
}
print.seqnullcqi.powder <- function(x, norm = FALSE, quant = 0.95, digits = 2, 
                                    append = FALSE, ...) {
    cat("Parametric bootstrap cluster analysis validation\n")
    cat("Sequence analysis null model:", deparse(x$nullmodel), "\n")
    cat("Number of bootstraps:", x$R, "\n")
    cat("Clustering method:", ifelse(x$kmedoid, "PAM/K-Medoid", paste0("hclust with ", x$hclust.method)), "\n")
    cat("Seqdist arguments:", deparse(x$seqdist.args), "\n\n\n")
    alls <- as.data.frame(x$clustrange$stats)
    quants <- rep("", ncol(alls))
    names(quants) <- colnames(alls)
    for (ss in colnames(alls)) {
        sumcqi <- normstatcqi2(x, stat = ss, norm = norm)
        alls[, ss] <- as.character(round(sumcqi$origstat, digits = digits))
        borne <- as.character(round(confcqi2(sumcqi$alldatamax, quant, x$R), digits = digits))
        quants[ss] <- paste0("[", borne[1], "; ", borne[2], "]")
    }
    results_tibble <- tibble::as_tibble(rbind(alls, rep("", length(quants)), quants))
    # Print a summary to the console for immediate feedback
    rownames(results_tibble) <- c(rownames(x$clustrange$stats), "", paste("Null Max-T", quant, "interval"))
    
    results_df <- as.data.frame(results_tibble)
    print(results_tibble, ...)
    return(list(
      results_tibble= results_tibble, 
      results_df= results_df
      ))
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
##:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
# Función para aplicar la prueba de Fisher a todas las combinaciones de filas usando todas las columnas
fisher_posthoc_all_cols <- function(contingency_table) {
  # Obtener combinaciones de filas (pares)
  row_pairs <- combn(rownames(contingency_table), 2, simplify = FALSE)
  
  # Aplicar la prueba de Fisher a cada par de filas usando todas las columnas al mismo tiempo
  results <- map_dfr(row_pairs, function(pair) {
    # Crear tabla de 2xN para el par de filas en todas las columnas
    sub_table <- contingency_table[pair, , drop = FALSE]
    
    # Aplicar el test de Fisher
    test_result <- fisher.test(sub_table, 
                                 simulate.p.value=T,
                                 B=1e4)
    
    # Devolver los resultados en un data frame
    tibble(
      Row1 = pair[1],
      Row2 = pair[2],
      p.value = test_result$p.value
    )
  })
  
  # Ajustar p-valores usando el método de Holm
  results <- results %>%
    mutate(p.adjusted = p.adjust(p.value, method = "holm"))
  
  return(results)
}
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
save_base_plot_as_grob <- function(plot_expr, res=300,  width = 1600, height= 1200) {
    # Crea un archivo temporal con extensión .png
    filename <- tempfile(fileext = ".png")
    
    # Guarda el gráfico en alta resolución en el archivo temporal
    png(filename, width = width, height = height, res = res)
    replayPlot(plot_expr)  # Reproduce el gráfico grabado
    dev.off()  # Cierra el dispositivo gráfico
    
    # Convierte el archivo PNG en un objeto gráfico (grob)
    grob <- grid::rasterGrob(png::readPNG(filename), interpolate = TRUE)
    
    return(grob)  # Devuelve el grob
}
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
chisq_cramerv<- function(contingency_table){
  chisq_test <- chisq.test(contingency_table)
  cramers_v <- sqrt(chisq_test$statistic / (sum(contingency_table) * (min(dim(contingency_table)) - 1)))
  
  list(chisq_statistic= sprintf("%1.2f", chisq_test$statistic), chisq_df= chisq_test$parameter, chisq_p_value = ifelse(chisq_test$p.value<.001, "<0.001", sprintf("%1.4f", chisq_test$p.value)), cramers_v = sprintf("%1.2f", cramers_v))
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#
oneway_anova_effect_size <- function(values, group) {
  # Perform one-way ANOVA
  anova_result <- aov(values ~ group)
  
  # Summarize ANOVA results
  anova_summary <- summary(anova_result)
  
  # Extract sums of squares
  ss_between <- anova_summary[[1]]$"Sum Sq"[1]
  ss_total <- sum(anova_summary[[1]]$"Sum Sq")
  
  # Calculate eta-squared
  eta_squared <- ss_between / ss_total
  
  # Return ANOVA summary and effect size
  list(
    anova_summary = anova_summary,
    eta_squared = eta_squared
  )
}

Resultados

2. Mensual

2.1. Sensibilidad= PAM (OM), sol 2 cluster- diagnósticos

Código
# pam   om  month   2
# pam   om  month   2

invisible("Información sobre la solución")
invisible("H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/_hist_sintaxis/un_inv_ii5_explorar_soluciones.R")
# 
invisible("Hacemos clasificación de pertenencia cluster y ponemos etiquetas")
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2 <-
  factor(pamRange_month_om$clustering$cluster2,levels=rev(attr( sort(table(pamRange_month_om$clustering$cluster2)), "name")),
         labels= c("6035, Un trimestre, al menos un TSM(2)", 
                   "6025, Un trimestre, TUS(1)"
         ))

invisible("Me da buena: 0,61 en promedio. Se mantiene. El problema está con 5710 es negativo")
sil_pam_om_clus2_m_nostd<-
  silhouette(as.integer(pamRange_month_om$clustering$cluster2), as.dist(dist_month_om))

# Crear etiquetas personalizadas
cluster_labels2_m <- paste0("Cluster ", 
          seq_along(attr(summary(sil_pam_om_clus2_m_nostd)$clus.avg.widths, "dimnames")[[1]]), 
          ":\nAWS ", sprintf("%1.2f",summary(sil_pam_om_clus2_m_nostd)$clus.avg.widths))

# Graficar con etiquetas personalizadas
fviz_silhouette(
  sil_pam_om_clus2_m_nostd, 
  lab.clusters = cluster_labels2_m, # Etiquetas personalizadas para los clústeres
  print.summary=F) +
  scale_fill_grey(start = 0.2, end = 0.8, labels = cluster_labels2_m) +  # Escala de grises
  scale_color_grey(start = 0.2, end = 0.8, labels = cluster_labels2_m)+   # Escala de grises para los bordea
  ggtitle(NULL)+
  labs(y="Ancho medio de la silueta", x="Conglomerados")# Elimina el título

Código
ggsave("_figs/sil_plot_pam_om2_m.png", width = 8, height = 5, dpi = 500)

Tiempo que demora esta sección: 0.4 minutos

De la figura se desprende que el conglomerado 6035, Un año despues, TSM tiene un ajuste promedio negativo. En menor medida, el conglomerado 6036, TSM, 1 año después, otras causas, tiene algunos valores de ancho de silueta negativos. Posteriormente vemos una tabla de contingencia para entender el origen de los nuevos conglomerados.

Código
# Crear la tabla de frecuencias proporcionales redondeada
tabla_proporciones2 <- round(prop.table(table(pamRange_month_om$clustering$cluster2, 
                                             pamRange_quarter_om$clustering$cluster4), 2), 2)

# Convertir la tabla a un formato limpio con kable
knitr::kable(tabla_proporciones2, 
             caption = "Proporciones de Clusters, Solución de 2 vs. 4 conglomerados", 
             col.names = c("5939, Un semestre TSM(1)", "5989, Comorbilidad un trimestre(2)", 
                           "6025, Un trimestre, TUS(3)", "6035, Un trimestre, TSM(4)"), 
             align = "c")
Proporciones de Clusters, Solución de 2 vs. 4 conglomerados
5939, Un semestre TSM(1) 5989, Comorbilidad un trimestre(2) 6025, Un trimestre, TUS(3) 6035, Un trimestre, TSM(4)
6025 0.01 0.07 1 0
6035 0.99 0.93 0 1

Tiempo que demora esta sección: 0 minutos

Luego vemos la clasificación de PPOO por cluster

Código
janitor::chisq.test(df_filled[,c("run","glosa_pueblo_originario")] %>% 
        dplyr::left_join(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam_om2")], by="run", multiple="first") %>% 
        janitor::tabyl(glosa_pueblo_originario, clus_pam_om2))

    Pearson's Chi-squared test

data:  df_filled[, c("run", "glosa_pueblo_originario")] %>% dplyr::left_join(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens[,     c("run", "clus_pam_om2")], by = "run", multiple = "first") %>%     janitor::tabyl(glosa_pueblo_originario, clus_pam_om2)
X-squared = 21.521, df = 8, p-value = 0.005884
Código
# X-squared = 136.81, df = 24, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

Generamos un gráfico de PPOO por cada conglomerado.

Código
ppoo_clus_pre_pam_om2_m<-
  df_filled[,c("run","glosa_pueblo_originario")] %>% 
  dplyr::left_join(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam_om2","factor_inclusivo_real_hist_mas_autperc")], by="run", multiple="first") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= dplyr::case_when(glosa_pueblo_originario=="NINGUNO" & factor_inclusivo_real_hist_mas_autperc!="00"~ "DESCONOCIDO", T~glosa_pueblo_originario)) %>% 
  janitor::tabyl(glosa_pueblo_originario_rec, clus_pam_om2) %>% 
  janitor::adorn_percentages("row")
#scale_fill_manual(values = rev(c("#D2B48C", "#E27A5B", "#708090", "#6B8E23", "#506070"  , "#2F4F4F", "#20B2AA"))) +
reshape2::melt(ppoo_clus_pre_pam_om2_m, id.vars = "glosa_pueblo_originario_rec") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= 
    dplyr::recode(glosa_pueblo_originario_rec, 
      "OTRO (ESPECIFICAR)"="OTRO(n=77)", 
      "RAPA NUI (PASCUENSE)"="RAPA NUI(n=34)", 
      "YAGÁN (YÁMANA)"="YAGÁN(n=2)",
      "AYMARA"="AYMARA(n=13)",
      "COLLA"="COLLA(n=6)",
      "DIAGUITA"="DIAGUITA(n=3)",
      "KAWÉSQAR"="KAWÉSQAR(n=4)",
      "MAPUCHE"="MAPUCHE(n=255)",
      "DESCONOCIDO"=".DESCONOCIDO(n=1.985)",
      "NINGUNO"=".NINGUNO(n=9.156)")) %>% 
ggplot(aes(x = glosa_pueblo_originario_rec, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "fill") + 
  scale_fill_manual(values =  c(#, al menos un TSM(2)
  "6035, Un trimestre, al menos un TSM(2)" = "#D2B48C", 
  "6025, Un trimestre, TUS(1)" = "#E27A5B"
)) +
  labs(title = NULL,
       x = "Grupo Étnico",
       y = "Proporción de Casos",
       fill = "Grupos") +  # Cambia el título de la leyenda a "Grupos"
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 12),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 12),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 14),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 14),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 14, margin = margin(b = -.1)),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 12)            # Tamaño del texto de la leyenda
    ) + 
  coord_flip()  # Hacer el gráfico horizontal
ggsave("_figs/grafico_ancho_achatado_pam_om2_m.png", width = 10, height = 5, dpi=1000)
PPOO por cluster

PPOO por cluster

Tiempo que demora esta sección: 0 minutos

Vemos que en los ingresados Rapa Nui, hay una importante proporción de participantes (50%) son clasificados en el conglomerado “5710, TSM, 1 año después, TSM”.

2.1.1. Trayectorias

Vemos los gráficos de las trayectorias

Código
categories_pam_om2_m<-attr(States_Wide.seq_month_t_prim_adm_cens, "labels")
new_labels <- categories_pam_om2_m
new_labels[which(categories_pam_om2_m == "Otras causas")] <- "Otras\ncausas"
#new_labels[which(categories == "Consumo\nde sustancias")] <- "Consumo de\nsustancias"

# Creamos un vector con las columnas llenando con NA si faltan valores
sil_pam_om_clus2_m <- wcSilhouetteObs(as.dist(dist_month_om), 
        pamRange_month_om$clustering$cluster2, measure="ASW")


seq_plot_pam_om2_m <- ggseqiplot(States_Wide.seq_month_t_prim_adm_cens, 
                                 group= ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2,
                                 facet_ncol=1, facet_nrow=2, sortv=sil_pam_om_clus2_m) +
  theme(legend.position = "none")+
  labs(x="Trimestres", y="# IDs de usuarios")+
  #guides(fill = guide_legend(nrow = 1))+
  theme(
    panel.spacing = unit(0.1, "lines"),  # Reduce el espaciado entre los paneles
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -10)),#,margin = margin(l = -10)),
    strip.text = element_text(size = 10, margin = margin(b =-15, t=10)),
    legend.text = element_text(size = 15),
    legend.spacing.x = unit(0.1, 'cm'),  # Alinea el título de la leyenda hacia la izquierda
    legend.box.margin = margin(t = 0, r = 0, b = 0, l = -50),
    legend.position = "bottom", 
    legend.justification = "left",
    panel.spacing.y = unit(0.2, "lines"),
    plot.margin = margin(10, 10, 10, 10), # Ajusta márgenes globales
    strip.placement = "outside",   # Para colocar las tiras fuera de los ejes
    strip.background = element_blank() # Elimina el fondo para que parezca más espacioso
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda
  )+
  guides(fill = guide_legend(nrow = 1)) +
  scale_fill_manual(labels = new_labels, values=c("#E2725B", "#556B2F", "#D2B48C",#"#8B4513",
                                                  "#FFFFFF","#808080","#000000"))+
  scale_color_manual(labels = new_labels, values=c("#E2725B", "#556B2F", "#D2B48C",#"#8B4513",
                                                   "#FFFFFF","#808080","#000000"))
seq_plot_pam_om2_m 

ggsave(filename="_figs/clusters_pam_om2_m_mod.png", seq_plot_pam_om2_m,  width = 11, height = 5.5, dpi=1000)
Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico (observaciones ordenadas de acuerdo a ASW)

Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico (observaciones ordenadas de acuerdo a ASW)

Tiempo que demora esta sección: 0.6 minutos

Código
seq_plot2_pam_om2_m <- ggseqdplot(States_Wide.seq_month_t_prim_adm_cens, 
                                 group= ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2,
                                 facet_ncol=1, facet_nrow=2) +
  theme(legend.position = "none")+  # Colocar la leyenda abajo
  labs(x="Trimestres", y="Frecuencia relativa de estados")+
  theme(
    panel.spacing = unit(0.1, "lines"),
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -5)),
    strip.text = element_text(size = 11),
    panel.spacing.y = unit(0.5, "lines"),
    strip.placement = "outside",   # Para colocar las tiras fuera de los ejes
    strip.background = element_blank() # Elimina el fondo para que parezca más espacioso
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda    
  )  # Colocar la leyenda abajo
seq_plot2_pam_om2_m
ggsave("_figs/clusterspam_om22_m_mod.png",seq_plot2_pam_om2_m, width = 8.5, height = 5.5, dpi=1000)


table_data_pam_om2_m <- sprintf("%1.2f",pamRange_month_om$stats[1,])
table_data_pam_om2_m <-as.data.frame(t(table_data_pam_om2_m))
colnames(table_data_pam_om2_m)<-attr(pamRange_month_om$stats, "name")
table_data_pam_om2_m %>% knitr::kable()
PBC HG HGSD ASW ASWw CH R2 CHsq R2sq HC
0.16 0.39 0.39 0.41 0.41 805.17 0.12 713.22 0.11 0.48

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Tiempo que demora esta sección: 0.1 minutos

De este modo, presenta el cambio agregado en la distribución de estados a lo largo del tiempo, sin considerar las secuencias individuales.

Código
invisible("Definimos las observaciones que tienen siluetas negativas")
sil_neg_pam_om_clus2_m <- which(sil_pam_om_clus2_m<0)

invisible("A qué conglomerados pertenecen?")
table(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens[sil_neg_pam_om_clus2_m, "clus_pam_om2"])

ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$rn<- 1:nrow(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens)
clus_pam_om2
6035, Un trimestre, al menos un TSM(2)             6025, Un trimestre, TUS(1) 
                                   159                                      0 

Tiempo que demora esta sección: 0 minutos

2.1.2.Exploración transiciones

2.1.2.a Transiciones- RM y no RM

Tasas de transición no RM a RM y viceversa

Código
invisible("Tasas de transición no RM a RM y viceversa")

trim_tasa_pam_om2_m_cens_cnt<-  
  seqcount_t(States_Wide.seq_month_t_prim_adm_RM_cens, 
             group=ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa_pam_om2_m_cens_rate<-  
  seqtrate_t(States_Wide.seq_month_t_prim_adm_RM_cens, 
             group=ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Código
trim_tasa_pam_om2_m_cens_rate %>%   
  dplyr::left_join(trim_tasa_pam_om2_m_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  dplyr::filter(from %in% c("RM", "noRM")) %>%  
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")

invisible("Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.1 minutos

Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)

2.1.2.b Transiciones
Código
trim_tasa2_pam_om2_m_cens_cnt<-  
   seqcount_t(States_Wide.seq_month_t_prim_adm_cens, 
             group=ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa2_pam_om2_m_cens_rate<-  
  seqtrate_t(States_Wide.seq_month_t_prim_adm_cens, 
             group=ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Código
trim_tasa2_pam_om2_m_cens_rate %>%   
  dplyr::left_join(trim_tasa2_pam_om2_m_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  #dplyr::filter(from %in% c("RM", "noRM")) %>%  
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")
Porcentajes de transición, transiciones posteriores, por cada cluster

Porcentajes de transición, transiciones posteriores, por cada cluster

Tiempo que demora esta sección: 0.1 minutos

2.1.2.c Tiempo promedio por cluster
Código
seq_mean_t(States_Wide.seq_month_t_prim_adm_cens, 
             group=ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2) %>% 
  data.table::as.data.table(keep.rowname=T) %>%
  dplyr::mutate(rn= gsub("\\d", "", rn)) |> 
  ggplot(aes(x=rn, fill= factor_inclusivo, y=Mean))+
  geom_bar(width = 1, stat = "identity") +
  theme_minimal() +
  facet_wrap(~factor_inclusivo)+
  labs(title = NULL,
       x = NULL,
       y = NULL) +
  scale_fill_manual(values = rev(c("#D2B48C", "#E27A5B"))) +
  coord_flip()+
  theme(#axis.text.x = element_blank(),
    #axis.text.y = element_blank(),
    panel.grid = element_blank()) +
#  scale_fill_brewer(palette = "Pastel1", labels=c("Sin\nautoidentificación\nni reconocimiento", "Autoidentificación\nsin reconocimiento", "Ambas")) +
  geom_text(aes(label = round(Mean,1)), 
            position = position_stack(vjust = 0.5), 
            size = 3.5, # Ajusta el tamaño de la fuente aquí
            color = "black", # Color del texto
            family = "sans", # Puedes cambiar la fuente si lo deseas
            background = element_rect(fill = "white", color = NA)) + # Fondo blanco
  theme(legend.title = element_blank(), legend.position="none")
Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo que demora esta sección: 0.1 minutos

Observamos que aquellos en el conglomerado que se encuentra ingresada por trastornos de salud mental tiene un porcentaje levemente mayor de censura.

2.1.3. Comparación variables

2.1.3.a. Comparación covariables- PPOO
Código
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::count(clus_pam_om2, factor_inclusivo_real_hist_mas_autperc) %>%
  dplyr::group_by(clus_pam_om2) %>%
  dplyr::mutate(n_prop = paste0(n, " (",scales::percent(n / sum(n)),")")) %>%
  dplyr::select(-n) %>%
  tidyr::pivot_wider(names_from = factor_inclusivo_real_hist_mas_autperc, values_from = n_prop, values_fill = "0")%>% 
  knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "No se identifica/hay reconocimiento", "Se identifica/hay reconocimeinto"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO")
Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO
Conglomerados No se identifica/no pertenece No se identifica/hay reconocimiento Se identifica/hay reconocimeinto
6035, Un trimestre, al menos un TSM(2) 4313 (80.8%) 592 (11.1%) 432 (8.1%)
6025, Un trimestre, TUS(1) 550 (78.5%) 80 (11.4%) 71 (10.1%)

Tiempo que demora esta sección: 0 minutos

Vemos las categorías de clasificación de PPOO según autopercepción (en MINSAL y en RSH) y reconocimiento CONADI.

Código
chisq.test(table(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc,ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2))
#X-squared = 3.5602, df = 2, p-value = 0.1686

message("Descartando valores negativos en sil width")
chisq.test(
with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m), table(factor_inclusivo_real_hist_mas_autperc, clus_pam_om2))
)

    Pearson's Chi-squared test

data:  table(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc,     ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2)
X-squared = 3.5602, df = 2, p-value = 0.1686


    Pearson's Chi-squared test

data:  with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens,     !rn %in% sil_neg_pam_om_clus2_m), table(factor_inclusivo_real_hist_mas_autperc,     clus_pam_om2))
X-squared = 3.5198, df = 2, p-value = 0.1721

Tiempo que demora esta sección: 0 minutos

No se constata una asocaición entre autoidentificación/reconocimiento perteneciente a PPOO y la pertenencia a conglomerados.

Ahora lo hacemos con la versión binarizada

Código
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin<- ifelse(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc=="00",0,1)

ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==60,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc_bin,clus_pam_om2) %>%
    janitor::chisq.test()
#X-squared = 2.0428, df = 1, p-value = 0.1529
#
#
message("Descartando valores negativos en sil width")
chisq.test(
with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m), table(pueblo_originario_01 , clus_pam_om2))
)

    Pearson's Chi-squared test with Yates' continuity correction

data:  .
X-squared = 2.0428, df = 1, p-value = 0.1529


    Pearson's Chi-squared test with Yates' continuity correction

data:  with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens,     !rn %in% sil_neg_pam_om_clus2_m), table(pueblo_originario_01,     clus_pam_om2))
X-squared = 0.45732, df = 1, p-value = 0.4989

Tiempo que demora esta sección: 0 minutos

Tampoco se observa asociación alguna. Hicimos una prueba post-hoc usando Bonferroni

2.1.3.b. Comparación covariables- Mortalidad
Código
# 
invisible("No hay nada, el tiempo promedio de censura es similar")

ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==60,0,1)) %>% 
  janitor::tabyl(clus_pam_om2,death_time_rec) %>% 
  dplyr::mutate(`1`= paste0(`1`," (", scales::percent(`1`/(`0`+`1`), accuracy=.1),")")) %>% 
  dplyr::left_join(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::group_by(clus_pam_om2) %>% 
  dplyr::summarise(mean=sprintf("%1.1f",mean(cens_time)),
  median=sprintf("%1.1f",quantile(cens_time, .5)), p25=sprintf("%1.1f",quantile(cens_time, .25)), p75=sprintf("%1.1f",quantile(cens_time, .75))), by="clus_pam_om2") %>% 
  dplyr::select(-`0`) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado","Mortalidad observada", "Promedio", "Mediana", "Q1", "Q3"), caption="Post-hoc, conglomerado vs. Mortalidad y tiempo a censura")
Post-hoc, conglomerado vs. Mortalidad y tiempo a censura
Conglomerado Mortalidad observada Promedio Mediana Q1 Q3
6035, Un trimestre, al menos un TSM(2) 56 (1.0%) 53.8 53.8 51.0 56.5
6025, Un trimestre, TUS(1) 14 (2.0%) 54.6 54.9 51.6 57.8

Tiempo que demora esta sección: 0 minutos

Código
# Cargar las librerías necesarias
library(survival)
library(ggplot2)

# Crear la variable de supervivencia
surv_obj <- Surv(time = ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$death_time,
                 event = ifelse(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$death_time==60,0,1))

# Realizar el análisis de Log-Rank (survdiff)
surv_diff <- survdiff(surv_obj ~ clus_pam_om2,
                      data = ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens)

# Mostrar los resultados del test
print(surv_diff)
Call:
survdiff(formula = surv_obj ~ clus_pam_om2, data = ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens)

                                                       N Observed Expected
clus_pam_om2=6035, Un trimestre, al menos un TSM(2) 5337       56     61.9
clus_pam_om2=6025, Un trimestre, TUS(1)              701       14      8.1
                                                    (O-E)^2/E (O-E)^2/V
clus_pam_om2=6035, Un trimestre, al menos un TSM(2)     0.562      4.86
clus_pam_om2=6025, Un trimestre, TUS(1)                 4.295      4.86

 Chisq= 4.9  on 1 degrees of freedom, p= 0.03 
Código
# Ajustar el modelo de Kaplan-Meier
km_fit <- survfit(surv_obj ~ clus_pam_om2,
                  data = ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens)

# Extraer los datos del modelo Kaplan-Meier para usar con ggplot
km_data <- data.frame(
  time = km_fit$time,
  surv = km_fit$surv,
  upper = km_fit$upper,
  lower = km_fit$lower,
  strata = rep(c("6035, Un trimestre, al menos un TSM(2)","6025, Un trimestre, TUS(1)"), km_fit$strata)
)

# Crear el gráfico de Kaplan-Meier con ggplot2
ggplot(km_data, aes(x = time, y = surv, color = strata)) +
  geom_step(size = 1.2) +  # Curvas de supervivencia
  geom_ribbon(aes(ymin = lower, ymax = upper, fill = strata), alpha = 0.2, color = NA) +  # Intervalos de confianza
  labs(
    title = "Curvas de Kaplan-Meier",
    x = "Tiempo (meses)",
    y = "Probabilidad de Supervivencia",
    color = "Grupo",
    fill = "Grupo"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom") +
  scale_color_manual(values = c("#E2725B", "#D2B48C")) +  # Colores para las curvas
  scale_fill_manual(values = c("#E2725B", "#D2B48C"))    # Colores para las áreas sombreadas

Tiempo que demora esta sección: 0 minutos

Código
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==60,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam_om2) %>% 
              janitor::chisq.test(correct=T)
#X-squared = 11.293, df = 6, p-value = 0.07972

ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==60,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam_om2) %>% 
              janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 0.04477

message("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m)%>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==60,0,1)), table(death_time_rec , clus_pam_om2))
)

#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
##_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
tab_cl_mortalidad_pam_om2_m<- 
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==60,0,1)) |> 
  janitor::tabyl(death_time_rec,clus_pam_om2) |> 
  as.matrix(ncol=2)

labels_pam_om2_m <- c(
  "6035, Un trimestre, TSM(2)",
  "6025, Un trimestre, TUS(1)"
)
# Realizar el análisis y crear la tabla directamente
pairwise.prop.test(t(tab_cl_mortalidad_pam_om2_m[,2:ncol(tab_cl_mortalidad_pam_om2_m)]), p.adjust.method = "holm")$p.value |>
  as.table() |>
  as.data.frame() |>
  rename(Grupo_1 = Var1, Grupo_2 = Var2, p_value = Freq) |>
  filter(!is.na(p_value)) |>
  mutate(
    Grupo_1 = labels_pam_om2_m[as.numeric(Grupo_1)],
    Grupo_2 = labels_pam_om2_m[as.numeric(Grupo_2)],
    p_value = ifelse(p_value <.001, "<.001", sprintf("%1.3f",p_value)) 
  ) |>
  kable(
    col.names = c("Grupo 1", "Grupo 2", "Valor p ajustado"),
    align = "l",
    caption= "Corrección parcial por comparaciones múltiples (Holm–Bonferroni)"
  )

    Pearson's Chi-squared test with Yates' continuity correction

data:  .
X-squared = 4.0662, df = 1, p-value = 0.04375


    Fisher's Exact Test for Count Data

data:  .
p-value = 0.03707
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.9823357 3.5202478
sample estimates:
odds ratio 
   1.92159 

$chisq_statistic
[1] "3.88"

$chisq_df
df 
 1 

$chisq_p_value
[1] "0.0488"

$cramers_v
[1] "0.03"
Corrección parcial por comparaciones múltiples (Holm–Bonferroni)
Grupo 1 Grupo 2 Valor p ajustado
6035, Un trimestre, TSM(2) 6035, Un trimestre, TSM(2) 0.044

Tiempo que demora esta sección: 0 minutos

Se constata una asociación muy modesta entre la pertenencia a un conglomerado y mortalidad, siendo 6025, Un trimestre, TUS(1) mayores sus chances de mortalidad.

2.1.3.c. Comparación covariables- no RM vs. RM
Código
chisq_cramerv(table(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2,ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base))
# $chisq_statistic
# [1] "26.58"
# 
# $chisq_df
# df 
#  1 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.07"

message("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m), table(codigo_region_rec_base , clus_pam_om2))
)


table(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2,ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base) %>% 
    data.frame() |>  
    dplyr::group_by(Var1) |> 
    dplyr::mutate(perc= scales::percent(Freq/sum(Freq), accuracy=1)) |> 
    dplyr::ungroup() |> 
    dplyr::mutate(Freq= Freq)  |>
    dplyr::mutate(fp= paste0(Freq, " (", perc,")" )) |> 
    dplyr::select(-Freq, -perc) |> 
    tidyr::pivot_wider(names_from="Var2",values_from="fp")  |> 
  knitr::kable("markdown", caption="Frecuencias absolutas y relativas por fila", col.names= c("Conglomerados", "Fuera de RM", "En RM"))
$chisq_statistic
[1] "26.58"

$chisq_df
df 
 1 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.07"

$chisq_statistic
[1] "24.53"

$chisq_df
df 
 1 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.06"
Frecuencias absolutas y relativas por fila
Conglomerados Fuera de RM En RM
6035, Un trimestre, al menos un TSM(2) 2802 (53%) 2535 (47%)
6025, Un trimestre, TUS(1) 441 (63%) 260 (37%)

Tiempo que demora esta sección: 0 minutos

Al parecer, el conglomerado 6025, Un trimestre, TUS(1) tendría una proporción significativamente mayor que el resto de pacientes fuera de la RM, aunque con una fuerza de asociación débil.

Código
chisq.posthoc.test(
table(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om2,ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base)
) %>% 
  dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  dplyr::filter(Dimension=="6025, Un trimestre, TUS(1)") |> 
  #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
  group_by(Dimension) %>%
  summarise(across(2:(ncol(.)-1),
                   ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
  dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
  #dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=1)","p=1.000)",.)) %>% 
  #dplyr::mutate(Dimension= tab_clus_macrozona_pam_om4_q[1]) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-RM vs. No-RM")
Comparación post-hoc, conglomerado-RM vs. No-RM
Dimension noRM RM
6025, Un trimestre, TUS(1) 5.20 (p<0.001) -5.20 (p<0.001)

Tiempo que demora esta sección: 0 minutos

De la tabla anterior, se observa que participantes pertenecientes al conglomerado “6025, Un trimestre, TUS(1)” presenta una menor proporción de residentes de la Región Metropolitana.

2.1.3.e. Comparación covariables- Región
Código
tab_cluster_region_pam_om2_m<-
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(estab_homo_base= as.numeric(estab_homo_base))%>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_pam_om2) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2)

#colnames(tab_cluster_region_pam_om4_q)<- c("reg", "c1", "c4", "c3", "c5", "c6", "c7", "c8", "c9", "c2")
cod_reg_homo_pam_om2_m<-
data.frame(
  codigo_region = 1:16,
  nombre_region = c(
    "Región de Tarapacá",
    "Región de Antofagasta",
    "Región de Atacama",
    "Región de Coquimbo",
    "Región de Valparaíso",
    "Región del Libertador General Bernardo O'Higgins",
    "Región del Maule",
    "Región del Biobío",
    "Región de La Araucanía",
    "Región de Los Lagos",
    "Región de Aysén del General Carlos Ibáñez del Campo",
    "Región de Magallanes y de la Antártica Chilena",
    "Región Metropolitana de Santiago",
    "Región de Los Ríos",
    "Región de Arica y Parinacota",
    "Región de Ñuble"
  ),
  stringsAsFactors = FALSE
)

dplyr::mutate(tab_cluster_region_pam_om2_m, promedio_fila = rowMeans(across(2:length(colnames(tab_cluster_region_pam_om2_m))))) %>% 
  dplyr::arrange(desc(promedio_fila)) %>% 
  dplyr::left_join(cod_reg_homo_pam_om7_q, by="codigo_region") %>% 
  dplyr::select(codigo_region, nombre_region, everything()) %>% 
  dplyr::select(-promedio_fila) %>% 
  dplyr::mutate_at(3:(length(colnames(tab_cluster_region_pam_om2_m))+1),~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentaje por región")
Porcentaje por región
codigo_region nombre_region 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
13 Región Metropolitana de Santiago 46% 36%
10 Región de Los Lagos 6% 19%
5 Región de Valparaíso 8% 12%
8 Región del Biobío 10% 8%
9 Región de La Araucanía 5% 4%
6 Región del Libertador General Bernardo O’Higgins 4% 3%
7 Región del Maule 4% 3%
14 Región de Los Ríos 3% 3%
1 Región de Tarapacá 2% 2%
11 Región de Aysén del General Carlos Ibáñez del Campo 2% 2%
16 Región de Ñuble 2% 2%
2 Región de Antofagasta 2% 1%
3 Región de Atacama 2% 1%
12 Región de Magallanes y de la Antártica Chilena 1% 2%
4 Región de Coquimbo 1% 1%
15 Región de Arica y Parinacota 2% 0%

Tiempo que demora esta sección: 0 minutos

A partir de la tabla, salta a la vista un importante porcentaje de pacientes clasificados en el conglomerado 6025, Un trimestre, TUS (19% vs. 6%) que fue atendido en la Región de Los Lagos y en la Región de Valparaíso (12% vs. 8%).

Código
tab_clus_reg_pam_om2_m<-
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(estab_homo_base= as.numeric(estab_homo_base))%>%
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
    janitor::tabyl(codigo_region, clus_pam_om2)

chisq_cramerv(tab_clus_reg_pam_om2_m[,-1])
# $chisq_statistic
# [1] "184.78"
# 
# $chisq_df
# df 
# 15 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.17"

janitor::fisher.test(tab_clus_reg_pam_om2_m, simulate.p.value=T, B=1e5)
#p-value = 1e-05

message("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens , !rn %in% sil_neg_pam_om_clus2_m)%>% 
       dplyr::mutate(estab_homo_base= as.numeric(estab_homo_base))%>%
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") , table(codigo_region , clus_pam_om2))
)
$chisq_statistic
[1] "184.78"

$chisq_df
df 
15 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.17"


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  tab_clus_reg_pam_om2_m
p-value = 1e-05
alternative hypothesis: two.sided

$chisq_statistic
[1] "188.51"

$chisq_df
df 
15 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.18"

Tiempo que demora esta sección: 0 minutos

Se encuentra una asociación significativa aunque débil entre región y conglomerados.

Por macrozona

Código
tab_clus_macrozona_pam_om2_m<-
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(estab_homo_base= as.numeric(estab_homo_base))%>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) %>% 
  janitor::tabyl(macrozona, clus_pam_om2) 

chisq_cramerv(tab_clus_macrozona_pam_om2_m[,-1])
# $chisq_statistic
# [1] "100.16"
# 
# $chisq_df
# df 
#  5 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.13"

message("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m)%>% 
       dplyr::mutate(estab_homo_base= as.numeric(estab_homo_base))%>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) , table(macrozona, clus_pam_om2))
)

tab_clus_macrozona_pam_om2_m %>%
  janitor::adorn_percentages("col") %>%
  janitor::adorn_rounding(digits = 2) %>%
  dplyr::mutate(across(-macrozona, ~ sprintf("%d (%.0f%%)", tab_clus_macrozona_pam_om2_m[[cur_column()]], . * 100))) |> 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. macrozona")
$chisq_statistic
[1] "100.16"

$chisq_df
df 
 5 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.13"

$chisq_statistic
[1] "99.85"

$chisq_df
df 
 5 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.13"
Porcentajes por columna, conglomerado vs. macrozona
macrozona 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
Macrozona Austral 179 (3%) 29 (4%)
Macrozona Centro 502 (9%) 91 (13%)
Macrozona Centro Sur 1067 (20%) 118 (17%)
Macrozona Norte 427 (8%) 31 (4%)
Macrozona Sur 730 (14%) 183 (26%)
RM 2432 (46%) 249 (36%)

Tiempo que demora esta sección: 0 minutos

Hay una asociación significativa aunque débil entre macrozona y pertenencia a cluster.

El conglomerado 6025, Un trimestre, TUS (1) concentra un porcentaje reducido en la Macrozona Centro (9% vs. 13%). Por otro lado, pacientes en 6025, Un trimestre, TUS (1) pertenecen en mayor proporción a la Macrozona Sur (26% vs. 14%), aunque menor en la Macrozona Norte (4% vs. 8%).

Código
chisq.posthoc.test(tab_clus_macrozona_pam_om2_m[-1]) %>% 
  dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
  group_by(Dimension) %>%
  summarise(across(2:(ncol(.)-1),
                   ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
  dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
  dplyr::mutate(Dimension= tab_clus_macrozona_pam_om2_m[1]) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-Macrozona")
Comparación post-hoc, conglomerado-Macrozona
Dimension 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
Macrozona Austral -1.07 (p=1.000) 1.07 (p=1.000)
Macrozona Centro -2.99 (p=0.033) 2.99 (p=0.033)
Macrozona Centro Sur 1.98 (p=0.572) -1.98 (p=0.572)
Macrozona Norte 3.36 (p=0.009) -3.36 (p=0.009)
Macrozona Sur -8.63 (p<0.001) 8.63 (p<0.001)
RM 5.03 (p<0.001) -5.03 (p<0.001)

Tiempo que demora esta sección: 0 minutos

Código
pairwise_chisq_gof_test(tab_clus_macrozona_pam_om2_m[-1], p.adjust.method="holm")|> 
  knitr::kable("markdown", caption="Dependencia categórica sol. 2 conglomerados (mensual), por pares de categorías en Macrozona (corrección Holm-Bonferroni)")

#Groups sharing a letter are not significantlt different (alpha = 0.05)
Dependencia categórica sol. 2 conglomerados (mensual), por pares de categorías en Macrozona (corrección Holm-Bonferroni)
n group1 group2 statistic p df p.adj p.adj.signif
6038 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1) 100.155 0 5 0 ****

Tiempo que demora esta sección: 0 minutos

Las pruebas post-hoc muestran que un mayor porcentaje de pacientes clasificados en 6035, Un trimestre, TSM(2) se concentran en la macrozona norte y menos en la macrozona sur y centro. En cambio, 6025, Un trimestre, TUS(1) concentra un mayor porcentaje en la macrozona sur y centro, mientras que menos en la macrozona norte.

2.1.3.f. Comparación covariables- Sexo
Código
tab_clus_sexo_pam_om2_m<-  
  ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(glosa_sexo, clus_pam_om2 )

chisq_cramerv(tab_clus_sexo_pam_om2_m[,-1])
# $chisq_statistic
# [1] "191.47"
# 
# $chisq_df
# df 
#  1 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.18"
#  
message("Descartando valores negativos en sil width")
chisq_cramerv(with(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m), table(glosa_sexo, clus_pam_om2))
)

tab_clus_sexo_pam_om2_m%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate(across(-glosa_sexo, ~sprintf("%d (%.0f%%)", tab_clus_sexo_pam_om2_m[[cur_column()]],.*100)))|> 
  #dplyr::mutate_at(2:ncol(.),~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. sexo")
$chisq_statistic
[1] "191.47"

$chisq_df
df 
 1 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.18"

$chisq_statistic
[1] "201.83"

$chisq_df
df 
 1 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.19"
Porcentajes por columna, conglomerado vs. sexo
glosa_sexo 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
HOMBRE 2271 (43%) 493 (70%)
MUJER 3066 (57%) 208 (30%)

Tiempo que demora esta sección: 0 minutos

Hay una asociación con una fuerza débil-moderada entre la pertenencia a un conglomerado y el sexo. Entre pacientes clasificados a 6025, Un trimestre, TUS(1) hay un menor porcentaje de mujeres (30% vs. 57%).

Código
chisq.posthoc.test(tab_clus_sexo_pam_om2_m[-1])%>% 
    dplyr::mutate(Dimension= rep(c("HOMBRE", "MUJER"), each=2)) %>% 
    dplyr::filter(Dimension=="MUJER") %>%
    dplyr::mutate(across(3:ncol(.), ~ dplyr::case_when(Value=="Residuals"~ sprintf("%1.2f", as.numeric(.)), Value=="p values"~ sprintf("%1.3f", as.numeric(gsub("\\*","",.)))))) %>% 
  dplyr::mutate(across(3:ncol(.), ~ dplyr::case_when(Value=="p values" & .=="0.000"~"<0.001",T~.))) %>% 
  knitr::kable("markdown", caption="Post-hoc, conglomerado vs. sexo")
Post-hoc, conglomerado vs. sexo
Dimension Value 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
MUJER Residuals 13.88 -13.88
MUJER p values <0.001 <0.001

Tiempo que demora esta sección: 0 minutos

Código
pairwise_chisq_gof_test(tab_clus_sexo_pam_om2_m[-1], p.adjust.method="holm")|> 
  dplyr::mutate(p= dplyr::case_when(p<0.001~ "<0.001",T~ sprintf("%1.3f",p)))|> 
  dplyr::mutate(p.adj= dplyr::case_when(p.adj<0.001~ "<0.001",T~ sprintf("%1.3f",p.adj)))|> 
  knitr::kable("markdown", caption="Dependencia categórica sol. 2 conglomerados (mensual), por pares de categorías en Sexo (corrección Holm-Bonferroni)") 
Dependencia categórica sol. 2 conglomerados (mensual), por pares de categorías en Sexo (corrección Holm-Bonferroni)
n group1 group2 statistic p df p.adj p.adj.signif
6038 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1) 191.4729 <0.001 1 <0.001 ****

Tiempo que demora esta sección: 0 minutos

2.1.3.g. Comparación covariables- Edad
Código
dt_ing_calendar_month_t_desde_primera_adm_dedup %>%
  dplyr::filter(month == 0) %>%
  dplyr::inner_join(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om2")], by="run") %>%
  dplyr::group_by(clus_pam_om2) %>%
  dplyr::summarise(mean_edad = mean(min_edad_anos),
                   sd= sd(min_edad_anos),
                   ci_lower = mean(min_edad_anos) - qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n()),
                   ci_upper = mean(min_edad_anos) + qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n())) %>% # Plot con ggplot2
ggplot(aes(x = clus_pam_om2, y = mean_edad)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Edad promedio") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/edad_minima_por_cluster_pam_om2_m.png", dpi=600)
Edad promedio primer ingreso con intervalo de confianza por conglomerado

Edad promedio primer ingreso con intervalo de confianza por conglomerado

Tiempo que demora esta sección: 0.1 minutos

Código
t.test(min_edad_anos ~ clus_pam_om2, 
             data = dt_ing_calendar_month_t_desde_primera_adm_dedup %>%
               dplyr::filter(month == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om2")], by="run"),var.equal = T)


dt_ing_calendar_month_t_desde_primera_adm_dedup %>%
    dplyr::filter(month == 0) %>%
    dplyr::inner_join(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens[, c("run", "clus_pam_om2")], by = "run") %>%
  {
    cohen.d(
     .$min_edad_anos,
     .$clus_pam_om2)
  }
# d estimate: -0.4448548 (small)
# 95 percent confidence interval:
#      lower      upper 
# -0.5240079 -0.3657017 

message("Descartando valores negativos en sil width")
dt_ing_calendar_month_t_desde_primera_adm_dedup %>%
    dplyr::filter(month == 0) %>%
    dplyr::inner_join(subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m)[,c("run","clus_pam_om2")], by="run")%>%
  {
    cohen.d(
     .$min_edad_anos,
     .$clus_pam_om2)
  }

    Two Sample t-test

data:  min_edad_anos by clus_pam_om2
t = -11.073, df = 6036, p-value < 2.2e-16
alternative hypothesis: true difference in means between group 6035, Un trimestre, al menos un TSM(2) and group 6025, Un trimestre, TUS(1) is not equal to 0
95 percent confidence interval:
 -2.255670 -1.577134
sample estimates:
mean in group 6035, Un trimestre, al menos un TSM(2) 
                                            20.53438 
            mean in group 6025, Un trimestre, TUS(1) 
                                            22.45078 


Cohen's d

d estimate: -0.4448548 (small)
95 percent confidence interval:
     lower      upper 
-0.5240079 -0.3657017 


Cohen's d

d estimate: -0.4557787 (small)
95 percent confidence interval:
     lower      upper 
-0.5351028 -0.3764547 

Tiempo que demora esta sección: 0 minutos

Los resultados del test de Welch indicaron que la diferencia de medias entre el conglomerado 6035, Un trimestre, TSM(2) (𝑀 = 20.5) y el grupo 6025, Un trimestre, TUS(1) (𝑀=22.5) fue estadísticamente significativa,𝑡(6036)=−11.07 𝑝<0.001, con un intervalo de confianza del 95% de [−2.56,−1.58]. y un tamaño del efecto pequeño (Cohen D= -0.46).

2.1.3.h. Comparación covariables- Previsión
Código
tab_clus_prev_pam_om2_m<-
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>%
    janitor::tabyl(prev_benef_rec_post, clus_pam_om2)

tab_clus_prev_pam_om2_m%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }
#X-squared = 11.459, df = 4, p-value = 0.02186
#p-value = 0.01693

subset(ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus2_m) %>%
    janitor::tabyl(prev_benef_rec_post, clus_pam_om2)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }

tab_clus_prev_pam_om2_m%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate(across(-prev_benef_rec_post, ~sprintf("%d (%.0f%%)", tab_clus_prev_pam_om2_m[[cur_column()]],.*100)))|>
  #dplyr::mutate_at(2:ncol(.),~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios")

    Pearson's Chi-squared test

data:  .
X-squared = 11.459, df = 4, p-value = 0.02186


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.01693
alternative hypothesis: two.sided


    Pearson's Chi-squared test

data:  .
X-squared = 11.99, df = 4, p-value = 0.01743


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.01262
alternative hypothesis: two.sided
Porcentajes por columna, conglomerado vs. Beneficios
prev_benef_rec_post 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
FFAA 216 (4%) 14 (2%)
FONASA A 1423 (27%) 197 (28%)
FONASA BC 1739 (33%) 224 (32%)
FONASA D 621 (12%) 100 (14%)
ISAPRE 1338 (25%) 166 (24%)

Tiempo que demora esta sección: 0 minutos

Código
chisq.posthoc.test(tab_clus_prev_pam_om2_m[-1]) %>% 
    dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
    #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
    group_by(Dimension) %>%
    summarise(across(2:(ncol(.)-1),
                     ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
    dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
    #dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=1)","p=1.000)",.)) %>% 
    dplyr::mutate(Dimension= dplyr::pull(tab_clus_prev_pam_om2_m[1])) %>% 
    knitr::kable("markdown", caption="Comparación post-hoc, conglomerado- Previsión")
Comparación post-hoc, conglomerado- Previsión
Dimension 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
FFAA 2.67 (p=0.077) -2.67 (p=0.077)
FONASA A -0.81 (p=1.000) 0.81 (p=1.000)
FONASA BC 0.34 (p=1.000) -0.34 (p=1.000)
FONASA D -2.02 (p=0.435) 2.02 (p=0.435)
ISAPRE 0.80 (p=1.000) -0.80 (p=1.000)

Tiempo que demora esta sección: 0 minutos

La asociación es levemente significativa y muy débil. Pacientes clasificados en 6035, Un trimestre, TSM(6) presenta un mayor porcentaje de pacientes en este conglomerado en una previsión de FFAA. Con todo, esta asociación no es consistente en las distintas pruebas.

2.1.3.i. Comparación covariables- Niv. Complejidad
Código
tab_clus_compl_pam_om2_m<-
ing_dt_ing_calendar_month_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(estab_homo_base= as.numeric(estab_homo_base))%>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_pam_om2) 

tab_clus_compl_pam_om2_m%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate(across(-nivel_de_complejidad, ~sprintf("%d (%.0f%%)", tab_clus_compl_pam_om2_m[[cur_column()]],.*100)))|>
  #dplyr::mutate_at(2:ncol(.), ~scales::percent(as.numeric(.), accuracy=.1)) %>% 
  knitr::kable(caption="Tabla de contingencia, Niv. de complejidad (proporción por columna)")
Tabla de contingencia, Niv. de complejidad (proporción por columna)
nivel_de_complejidad 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
Alta Complejidad 3250 (61%) 477 (68%)
Baja Complejidad 848 (16%) 130 (19%)
Mediana Complejidad 1056 (20%) 83 (12%)
Pendiente 145 (3%) 5 (1%)
Sin dato 38 (1%) 6 (1%)

Tiempo que demora esta sección: 0 minutos

Código
chisq.posthoc.test(tab_clus_compl_pam_om2_m[-1]) %>% 
    dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
    #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
    group_by(Dimension) %>%
    summarise(across(2:(ncol(.)-1),
                     ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
    dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
    #dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=1)","p=1.000)",.)) %>% 
    dplyr::mutate(Dimension= dplyr::pull(tab_clus_compl_pam_om2_m[1])) %>% 
    knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-Niv. complejidad")
Comparación post-hoc, conglomerado-Niv. complejidad
Dimension 6035, Un trimestre, al menos un TSM(2) 6025, Un trimestre, TUS(1)
Alta Complejidad -3.66 (p=0.002) 3.66 (p=0.002)
Baja Complejidad -1.79 (p=0.728) 1.79 (p=0.728)
Mediana Complejidad 5.06 (p<0.001) -5.06 (p<0.001)
Pendiente 3.20 (p=0.014) -3.20 (p=0.014)
Sin dato -0.42 (p=1.000) 0.42 (p=1.000)

Tiempo que demora esta sección: 0 minutos

A partir de la tabla de contingencia y la prueba de residuos, se observa que 6025, Un trimestre, TUS(1) presenta un mayor porcentaje en establecimientos de Alta complejidad (68% vs. 61%) y menores porcentajes en Mediana complejidad (12% vs. 20%) y mayor porcentaje de casos con calificación Pendiente (3% vs. 1%).

2.1.4. Compilación comparación covariables

Código
#dput(attr(t(tab_clus_compl_pam_om7_q),"dimnames")[[1]])

# Definir los datos correctamente
data_pam_om2_m <-cbind.data.frame(
  Grupo= c("6035, Un trimestre, TSM(2)", "6025, Un trimestre, TUS(1)"), 
      PPOO_bin            = c(NA, NA), 
      PPOO_sinautoid          = c(NA, NA), 
      PPOO_conautoid          = c(NA, NA), 
      Mortalidad              = c(NA, "+"), 
      RM                      = c(NA, "-"), 
      `Macrozona-Austral`       = c(NA, NA), 
      `Macrozona-Centro`        = c(NA, "-"), 
      `Macrozona-Centro Sur`    = c(NA, NA), 
      `Macrozona-Norte`        = c(NA, "-"), 
      `Macrozona-Sur`         = c(NA, "+"), 
      Sexo_mujeres             = c(NA, "-"), 
      `Edad ingreso`         = c(NA, "+"), 
      `Previsión-FFAA`         = c(NA, NA), 
      `Previsión-FONASA A`     = c(NA, NA), 
      `Previsión-FONASA BC`     = c(NA, NA), 
      `Previsión-FONASA D`     = c(NA, NA), 
      `Previsión-ISAPRE`     = c(NA, NA), 
      `NivComp-Baja`     = c(NA, NA), 
      `NivComp-Media`     = c(NA, "+"), 
      `NivComp-Alta`     = c(NA, "-"))
#
# Asegurar que los nombres de las columnas sean válidos y no haya espacios en blanco
# Derretir el dataframe para que sea adecuado para ggplot2
data_melt_pam_om2_m <- reshape2::melt(data_pam_om2_m, id.vars = 'Grupo', variable.name = 'Variable', value.name = 'Asociación')

# Reemplazar los NA por un valor vacío
data_melt_pam_om2_m$Asociación[is.na(data_melt_pam_om2_m$Asociación)] <- "\n"

# Crear el gráfico con ggplot
data_melt_pam_om2_m %>% 
  dplyr::filter(Grupo=="6025, Un trimestre, TUS(1)")%>%
  dplyr::mutate(Variable = gsub("_", " ", Variable)) %>% 
ggplot(aes(x = Variable, y = Grupo, fill = Asociación)) +
  geom_tile(color = "white", size = 0.8) +
  scale_fill_manual(values = c("+" = "#556B2F", "-" = "#E2725B", "\n" = "white")) +
  labs(title =NULL, x = "Variables", y = "Conglomerado") +
  theme_minimal() +
  theme(#axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid = element_blank())+
  theme(
    axis.text.y = element_text(size = 17, face = "bold"),#,margin = margin(l = 7)),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 17, face = "bold"),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 16, face = "bold"),#,margin = margin(t = -15)),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 16, face = "bold"),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 17, face = "bold"),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 15, face = "bold")            # Tamaño del texto de la leyenda
  ) +
  coord_flip()
ggsave("_figs/asociaciones_pam_om2_m.png", width=8.8*.8, height=5*.8, dpi=1000)
Comparación covariables con agrupamiento

Comparación covariables con agrupamiento

Tiempo que demora esta sección: 0.1 minutos


Información de la sesión

Código
message(paste0("R library: ", Sys.getenv("R_LIBS_USER")))

R library: C:/R/win-library/4.4

Código
message(paste0("Date: ",withr::with_locale(new = c('LC_TIME' = 'C'), code =Sys.time())))

Date: 2025-01-22 20:45:40.090514

Código
message(paste0("Editor context: ", getwd()))

Editor context: H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II

Código
save.image("avance250117_3.RData")

Tiempo que demora esta sección: 0.2 minutos

Código
sesion_info <- devtools::session_info()
dplyr::select(
  tibble::as_tibble(sesion_info$packages),
  c(package, loadedversion, source)
) %>% 
 knitr::kable(caption = "R packages", format = "html",
      col.names = c("Row number", "Package", "Version"),
    row.names = FALSE,
      align = c("c", "l", "r")) %>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
R packages
Row number Package Version
abind 1.4-5 CRAN (R 4.4.0)
backports 1.5.0 CRAN (R 4.4.0)
boot 1.3-30 CRAN (R 4.4.0)
broom 1.0.6 CRAN (R 4.4.0)
cachem 1.1.0 CRAN (R 4.4.0)
car 3.1-2 CRAN (R 4.4.1)
carData 3.0-5 CRAN (R 4.4.1)
chisq.posthoc.test 0.1.3 Github (ebbertd/chisq.posthoc.test@186d2ca6bbdba9fc19601aff4696ae1b85e7e0b0)
cli 3.6.3 CRAN (R 4.4.1)
cluster 2.1.6 CRAN (R 4.4.0)
coda 0.19-4.1 CRAN (R 4.4.1)
codetools 0.2-20 CRAN (R 4.4.0)
colorspace 2.1-0 CRAN (R 4.4.0)
cowplot 1.1.3 CRAN (R 4.4.1)
crayon 1.5.3 CRAN (R 4.4.2)
curl 6.0.1 CRAN (R 4.4.2)
data.table 1.15.4 CRAN (R 4.4.0)
devtools 2.4.5 CRAN (R 4.4.1)
DiagrammeR 1.0.11 CRAN (R 4.4.0)
DiagrammeRsvg 0.1 CRAN (R 4.4.1)
digest 0.6.37 CRAN (R 4.4.0)
doFuture 1.0.1 CRAN (R 4.4.0)
doParallel 1.0.17 CRAN (R 4.4.0)
dplyr 1.1.4 CRAN (R 4.4.0)
effsize 0.8.1 CRAN (R 4.4.2)
ellipsis 0.3.2 CRAN (R 4.4.0)
emmeans 1.10.3 CRAN (R 4.4.1)
estimability 1.5.1 CRAN (R 4.4.1)
evaluate 1.0.1 CRAN (R 4.4.2)
expsmooth 2.3 CRAN (R 4.4.1)
factoextra 1.0.7 CRAN (R 4.4.1)
fansi 1.0.6 CRAN (R 4.4.0)
farver 2.1.2 CRAN (R 4.4.0)
fastmap 1.2.0 CRAN (R 4.4.0)
fma 2.5 CRAN (R 4.4.1)
forcats 1.0.0 CRAN (R 4.4.0)
foreach 1.5.2 CRAN (R 4.4.0)
forecast 8.23.0 CRAN (R 4.4.1)
fpp2 2.5 CRAN (R 4.4.1)
fracdiff 1.5-3 CRAN (R 4.4.1)
fs 1.6.5 CRAN (R 4.4.2)
future 1.33.2 CRAN (R 4.4.0)
future.apply 1.11.2 CRAN (R 4.4.0)
generics 0.1.3 CRAN (R 4.4.0)
ggh4x 0.2.8 CRAN (R 4.4.1)
ggplot2 3.5.1 CRAN (R 4.4.0)
ggpubr 0.6.0 CRAN (R 4.4.1)
ggrepel 0.9.5 CRAN (R 4.4.1)
ggseqplot 0.8.4 CRAN (R 4.4.1)
ggsignif 0.6.4 CRAN (R 4.4.1)
globals 0.16.3 CRAN (R 4.4.0)
glue 1.8.0 CRAN (R 4.4.2)
gridExtra 2.3 CRAN (R 4.4.0)
gtable 0.3.5 CRAN (R 4.4.0)
gtsummary 2.0.2 CRAN (R 4.4.1)
haven 2.5.4 CRAN (R 4.4.0)
hms 1.1.3 CRAN (R 4.4.0)
htmltools 0.5.8 CRAN (R 4.4.0)
htmlwidgets 1.6.4 CRAN (R 4.4.0)
httpuv 1.6.15 CRAN (R 4.4.0)
iterators 1.0.14 CRAN (R 4.4.0)
janitor 2.2.0 CRAN (R 4.4.0)
job 0.3.1 CRAN (R 4.4.1)
jsonlite 1.8.9 CRAN (R 4.4.2)
kableExtra 1.4.0 CRAN (R 4.4.1)
knitr 1.49 CRAN (R 4.4.2)
labeling 0.4.3 CRAN (R 4.4.0)
later 1.4.1 CRAN (R 4.4.2)
lattice 0.22-6 CRAN (R 4.4.0)
lifecycle 1.0.4 CRAN (R 4.4.0)
listenv 0.9.1 CRAN (R 4.4.0)
lmtest 0.9-40 CRAN (R 4.4.1)
lubridate 1.9.3 CRAN (R 4.4.0)
magrittr 2.0.3 CRAN (R 4.4.0)
MASS 7.3-60.2 local
Matrix 1.7-0 CRAN (R 4.4.0)
memoise 2.0.1 CRAN (R 4.4.0)
mgcv 1.9-1 CRAN (R 4.4.0)
mime 0.12 CRAN (R 4.4.0)
miniUI 0.1.1.1 CRAN (R 4.4.0)
multcomp 1.4-26 CRAN (R 4.4.0)
munsell 0.5.1 CRAN (R 4.4.0)
mvtnorm 1.2-5 CRAN (R 4.4.0)
NbClust 3.0.1 CRAN (R 4.4.0)
nlme 3.1-164 CRAN (R 4.4.0)
nnet 7.3-19 CRAN (R 4.4.0)
pacman 0.5.1 CRAN (R 4.4.1)
parallelly 1.37.1 CRAN (R 4.4.0)
patchwork 1.2.0 CRAN (R 4.4.1)
permute 0.9-7 CRAN (R 4.4.0)
pillar 1.9.0 CRAN (R 4.4.0)
pkgbuild 1.4.5 CRAN (R 4.4.2)
pkgconfig 2.0.3 CRAN (R 4.4.0)
pkgload 1.4.0 CRAN (R 4.4.2)
plyr 1.8.9 CRAN (R 4.4.0)
profvis 0.4.0 CRAN (R 4.4.2)
progressr 0.14.0 CRAN (R 4.4.0)
promises 1.3.2 CRAN (R 4.4.2)
purrr 1.0.2 CRAN (R 4.4.0)
quadprog 1.5-8 CRAN (R 4.4.0)
quantmod 0.4.26 CRAN (R 4.4.1)
R6 2.5.1 CRAN (R 4.4.0)
ragg 1.3.3 CRAN (R 4.4.2)
rbibutils 2.2.16 CRAN (R 4.4.1)
RColorBrewer 1.1-3 CRAN (R 4.4.0)
Rcpp 1.0.13 CRAN (R 4.4.1)
Rdpack 2.6 CRAN (R 4.4.1)
readr 2.1.5 CRAN (R 4.4.0)
remotes 2.5.0 CRAN (R 4.4.0)
reshape2 1.4.4 CRAN (R 4.4.0)
rio 1.1.1 CRAN (R 4.4.0)
rlang 1.1.4 CRAN (R 4.4.0)
rmarkdown 2.29 CRAN (R 4.4.2)
rstatix 0.7.2 CRAN (R 4.4.1)
rstudioapi 0.17.1 CRAN (R 4.4.2)
rsvg 2.6.0 CRAN (R 4.4.0)
sandwich 3.1-0 CRAN (R 4.4.1)
scales 1.3.0 CRAN (R 4.4.0)
sessioninfo 1.2.2 CRAN (R 4.4.0)
shiny 1.9.1 CRAN (R 4.4.2)
snakecase 0.11.1 CRAN (R 4.4.0)
stargazer 5.2.3 CRAN (R 4.4.0)
stringi 1.8.4 CRAN (R 4.4.0)
stringr 1.5.1 CRAN (R 4.4.0)
survival 3.5-8 CRAN (R 4.4.0)
svglite 2.1.3 CRAN (R 4.4.1)
systemfonts 1.1.0 CRAN (R 4.4.0)
textshaping 0.4.0 CRAN (R 4.4.0)
TH.data 1.1-2 CRAN (R 4.4.1)
tibble 3.2.1 CRAN (R 4.4.0)
tidyr 1.3.1 CRAN (R 4.4.0)
tidyselect 1.2.1 CRAN (R 4.4.0)
tidyverse 2.0.0 CRAN (R 4.4.0)
timechange 0.3.0 CRAN (R 4.4.0)
timeDate 4032.109 CRAN (R 4.4.0)
Tmisc 1.0.1 CRAN (R 4.4.1)
TraMineR 2.2-10 CRAN (R 4.4.0)
TraMineRextras 0.6.7 CRAN (R 4.4.0)
tseries 0.10-58 CRAN (R 4.4.1)
TTR 0.24.4 CRAN (R 4.4.1)
tzdb 0.4.0 CRAN (R 4.4.0)
urca 1.3-4 CRAN (R 4.4.1)
urlchecker 1.0.1 CRAN (R 4.4.0)
usethis 3.1.0 CRAN (R 4.4.2)
utf8 1.2.4 CRAN (R 4.4.0)
V8 4.4.2 CRAN (R 4.4.0)
vctrs 0.6.5 CRAN (R 4.4.0)
vegan 2.6-6.1 CRAN (R 4.4.0)
viridisLite 0.4.2 CRAN (R 4.4.0)
visNetwork 2.1.2 CRAN (R 4.4.0)
WeightedCluster 1.6-4 CRAN (R 4.4.0)
withr 3.0.2 CRAN (R 4.4.2)
xfun 0.49 CRAN (R 4.4.2)
xml2 1.3.6 CRAN (R 4.4.0)
xtable 1.8-4 CRAN (R 4.4.0)
xts 0.14.0 CRAN (R 4.4.1)
yaml 2.3.10 CRAN (R 4.4.1)
zoo 1.8-12 CRAN (R 4.4.0)

Tiempo que demora esta sección: 0.1 minutos

Código
reticulate::py_list_packages()%>% 
 knitr::kable(caption = "Python packages", format = "html",
      col.names = c("Package", "Version", "Requirement"),
    row.names = FALSE,
      align = c("c", "l", "r", "r"))%>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
Python packages
Package Version Requirement
absl-py 2.1.0 absl-py==2.1.0
asttokens 2.4.1 asttokens==2.4.1
astunparse 1.6.3 astunparse==1.6.3
audioconverter 2.0.3 audioconverter==2.0.3
autograd 1.6.2 autograd==1.6.2
autograd-gamma 0.5.0 autograd-gamma==0.5.0
beautifulsoup4 4.12.3 beautifulsoup4==4.12.3
Brotli 1.1.0 Brotli==1.1.0
certifi 2023.11.17 certifi==2023.11.17
cffi 1.16.0 cffi==1.16.0
charset-normalizer 3.3.2 charset-normalizer==3.3.2
clarabel 0.9.0 clarabel==0.9.0
click 8.1.7 click==8.1.7
cloudpickle 3.0.0 cloudpickle==3.0.0
colorama 0.4.6 colorama==0.4.6
comm 0.2.1 comm==0.2.1
contourpy 1.2.0 contourpy==1.2.0
cvxopt 1.3.2 cvxopt==1.3.2
cvxpy 1.5.2 cvxpy==1.5.2
cycler 0.12.1 cycler==0.12.1
debugpy 1.8.0 debugpy==1.8.0
decorator 4.4.2 decorator==4.4.2
delete-chrome-history-py 0.1.8 delete-chrome-history-py==0.1.8
easyocr 1.7.1 easyocr==1.7.1
ecos 2.0.13 ecos==2.0.13
editdistance 0.8.1 editdistance==0.8.1
efficientnet 1.0.0 efficientnet==1.0.0
essential-generators 1.0 essential-generators==1.0
et-xmlfile 1.1.0 et-xmlfile==1.1.0
executing 2.0.1 executing==2.0.1
fancyimpute 0.7.0 fancyimpute==0.7.0
ffmpeg 1.4 ffmpeg==1.4
ffmpeg-python 0.2.0 ffmpeg-python==0.2.0
filedir 0.0.3 filedir==0.0.3
filelock 3.13.1 filelock==3.13.1
flatbuffers 24.3.25 flatbuffers==24.3.25
fonttools 4.47.2 fonttools==4.47.2
formulaic 1.0.1 formulaic==1.0.1
fsspec 2023.12.2 fsspec==2023.12.2
future 0.18.3 future==0.18.3
gast 0.6.0 gast==0.6.0
git-filter-repo 2.45.0 git-filter-repo==2.45.0
google-pasta 0.2.0 google-pasta==0.2.0
graphviz 0.20.3 graphviz==0.20.3
grpcio 1.65.4 grpcio==1.65.4
gTTS 2.5.1 gTTS==2.5.1
h5py 3.11.0 h5py==3.11.0
idna 3.6 idna==3.6
imageio 2.34.2 imageio==2.34.2
imageio-ffmpeg 0.5.1 imageio-ffmpeg==0.5.1
imgaug 0.4.0 imgaug==0.4.0
iniconfig 2.0.0 iniconfig==2.0.0
interface-meta 1.3.0 interface-meta==1.3.0
ipykernel 6.29.5 ipykernel==6.29.5
ipython 8.20.0 ipython==8.20.0
jedi 0.19.1 jedi==0.19.1
Jinja2 3.1.3 Jinja2==3.1.3
joblib 1.4.0 joblib==1.4.0
jupyter_client 8.6.0 jupyter_client==8.6.0
jupyter_core 5.7.1 jupyter_core==5.7.1
keras 3.4.1 keras==3.4.1
Keras-Applications 1.0.8 Keras-Applications==1.0.8
keras-ocr 0.9.3 keras-ocr==0.9.3
kiwisolver 1.4.5 kiwisolver==1.4.5
knnimpute 0.1.0 knnimpute==0.1.0
lazy_loader 0.4 lazy_loader==0.4
libclang 18.1.1 libclang==18.1.1
lifelines 0.28.0 lifelines==0.28.0
llvmlite 0.41.1 llvmlite==0.41.1
Markdown 3.6 Markdown==3.6
markdown-it-py 3.0.0 markdown-it-py==3.0.0
MarkupSafe 2.1.4 MarkupSafe==2.1.4
matplotlib 3.8.2 matplotlib==3.8.2
matplotlib-inline 0.1.6 matplotlib-inline==0.1.6
mdurl 0.1.2 mdurl==0.1.2
mido 1.3.3 mido==1.3.3
ml-dtypes 0.4.0 ml-dtypes==0.4.0
more-itertools 10.2.0 more-itertools==10.2.0
moviepy 1.0.3 moviepy==1.0.3
mpmath 1.3.0 mpmath==1.3.0
multipledispatch 1.0.0 multipledispatch==1.0.0
mutagen 1.47.0 mutagen==1.47.0
namex 0.0.8 namex==0.0.8
natsort 8.4.0 natsort==8.4.0
nest-asyncio 1.5.9 nest-asyncio==1.5.9
networkx 3.2.1 networkx==3.2.1
ninja 1.11.1.1 ninja==1.11.1.1
nose 1.3.7 nose==1.3.7
numba 0.58.1 numba==0.58.1
numexpr 2.10.0 numexpr==2.10.0
numpy 1.26.3 numpy==1.26.3
openai-whisper 20231117 openai-whisper==20231117
opencv-python 4.10.0.84 opencv-python==4.10.0.84
opencv-python-headless 4.10.0.84 opencv-python-headless==4.10.0.84
openpyxl 3.1.4 openpyxl==3.1.4
opt-einsum 3.3.0 opt-einsum==3.3.0
optree 0.12.1 optree==0.12.1
osqp 0.6.5 osqp==0.6.5
packaging 23.2 packaging==23.2
pandas 2.2.0 pandas==2.2.0
pandas-flavor 0.6.0 pandas-flavor==0.6.0
parso 0.8.3 parso==0.8.3
patsy 0.5.6 patsy==0.5.6
pillow 10.2.0 pillow==10.2.0
platformdirs 4.1.0 platformdirs==4.1.0
pluggy 1.5.0 pluggy==1.5.0
polars 1.9.0 polars==1.9.0
proglog 0.1.10 proglog==0.1.10
prompt-toolkit 3.0.43 prompt-toolkit==3.0.43
protobuf 4.25.4 protobuf==4.25.4
psutil 5.9.8 psutil==5.9.8
pure-eval 0.2.2 pure-eval==0.2.2
pyarrow 15.0.0 pyarrow==15.0.0
pyclipper 1.3.0.post5 pyclipper==1.3.0.post5
pycparser 2.22 pycparser==2.22
pycryptodomex 3.20.0 pycryptodomex==3.20.0
pydotplus 2.0.2 pydotplus==2.0.2
pydub 0.24.1 pydub==0.24.1
Pygments 2.17.2 Pygments==2.17.2
pyjanitor 0.26.0 pyjanitor==0.26.0
PyMuPDF 1.24.9 PyMuPDF==1.24.9
PyMuPDFb 1.24.9 PyMuPDFb==1.24.9
pyparsing 3.1.1 pyparsing==3.1.1
PyPDF2 3.0.1 PyPDF2==3.0.1
pyreadr 0.5.0 pyreadr==0.5.0
pytesseract 0.3.10 pytesseract==0.3.10
pytest 8.3.1 pytest==8.3.1
python-bidi 0.6.0 python-bidi==0.6.0
python-dateutil 2.8.2 python-dateutil==2.8.2
pytube 15.0.0 pytube==15.0.0
pytube3 9.6.4 pytube3==9.6.4
pytz 2023.3.post1 pytz==2023.3.post1
pywin32 306 pywin32==306
PyYAML 6.0.1 PyYAML==6.0.1
pyzmq 25.1.2 pyzmq==25.1.2
qdldl 0.1.7.post1 qdldl==0.1.7.post1
regex 2023.12.25 regex==2023.12.25
requests 2.32.3 requests==2.32.3
rich 13.7.1 rich==13.7.1
rpy2 3.5.16 rpy2==3.5.16
scikit-image 0.24.0 scikit-image==0.24.0
scikit-learn 1.3.2 scikit-learn==1.3.2
scikit-survival 0.22.2 scikit-survival==0.22.2
scipy 1.11.4 scipy==1.11.4
scs 3.2.6 scs==3.2.6
seaborn 0.13.2 seaborn==0.13.2
semantic-version 2.10.0 semantic-version==2.10.0
setuptools-rust 1.8.1 setuptools-rust==1.8.1
shapely 2.0.5 shapely==2.0.5
six 1.16.0 six==1.16.0
soupsieve 2.5 soupsieve==2.5
SpeechRecognition 3.10.1 SpeechRecognition==3.10.1
spyder-kernels 3.0.2 spyder-kernels==3.0.2
stack-data 0.6.3 stack-data==0.6.3
statsmodels 0.14.1 statsmodels==0.14.1
sympy 1.12 sympy==1.12
target 0.0.11 target==0.0.11
tensorboard 2.17.0 tensorboard==2.17.0
tensorboard-data-server 0.7.2 tensorboard-data-server==0.7.2
tensorflow 2.17.0 tensorflow==2.17.0
tensorflow-intel 2.17.0 tensorflow-intel==2.17.0
tensorflow-io-gcs-filesystem 0.31.0 tensorflow-io-gcs-filesystem==0.31.0
termcolor 2.4.0 termcolor==2.4.0
threadpoolctl 3.4.0 threadpoolctl==3.4.0
tifffile 2024.7.24 tifffile==2024.7.24
tiktoken 0.5.2 tiktoken==0.5.2
torch 2.4.0 torch==2.4.0
torchaudio 2.4.0 torchaudio==2.4.0
torchvision 0.19.0 torchvision==0.19.0
tornado 6.4 tornado==6.4
tqdm 4.66.1 tqdm==4.66.1
traitlets 5.14.1 traitlets==5.14.1
translator 0.0.9 translator==0.0.9
typing_extensions 4.9.0 typing_extensions==4.9.0
tzdata 2023.4 tzdata==2023.4
tzlocal 5.2 tzlocal==5.2
urllib3 2.1.0 urllib3==2.1.0
validators 0.33.0 validators==0.33.0
watchdog 3.0.0 watchdog==3.0.0
wcwidth 0.2.13 wcwidth==0.2.13
websockets 12.0 websockets==12.0
Werkzeug 3.0.3 Werkzeug==3.0.3
whisper 1.1.10 whisper==1.1.10
wrapt 1.16.0 wrapt==1.16.0
xarray 2024.1.1 xarray==2024.1.1
youtube-dl 2021.12.17 youtube-dl==2021.12.17
yt-dlp 2024.7.9 yt-dlp==2024.7.9

Tiempo que demora esta sección: 0.3 minutos